2012-09-03 2 views
0

매번 다른 뷰 집합을 사용하여 뷰를 여러 번 호출하는 MVC4 컨트롤러가 있습니다.여러 포스트 백을 통해 MVC4 컨트롤러 데이터 지속

@using (Html.BeginForm()) 
{ 
    @if (ViewBag.Foo1 != null) 
    { 
     @Html.DropDownList("Bar1",.... 
    } 

    @if (ViewBag.Foo2 != null) 
    { 
     @Html.DropDownList("Bar2",.... 
    } 

    <input name="ActionButton" type="submit" value="Ok"" /> 
} 

사용자가 제출 버튼을 클릭 할 때마다, 상기 제어기의 검사는 수집 및 차종에 무슨 볼 : 뷰는 같은 ​​것을 통해 부재 또는 그 ViewBags의 존재에 기초하여 폼의 콘텐츠를 렌더링 일종의 같이, 다시보기를 호출하기 전에 ViewBags의 새로운 세트 : 내가 지금해야 할 것은 각 패스 컨트롤러를 목 한 어떻게 든

public ActionResult Create() 
{ 
    ViewBag.Foo1 = "blawblaw"; 
    return View(); 
} 

[HttpPost] 
public ActionResult Create(FormCollection collection) 
{ 
    if (collection["Bar1"] != null) 
    { 
     string FirstPass = collection["Bar1"]; 
     ViewBag.Foo2 = "blawblaw"; 
    } 

    if (collection["Bar2"] != null) 
    { 
     string SecondPass = collection["Bar2"]; 
     ViewBag.Foo3 = "blawblaw"; 
    } 

    return View(); 
} 

이전의 패스에 대해 뭔가를 '기억'. 즉, 필자의 예제에서 컨트롤러 (컬렉션 [ "Bar2"]가 참인 곳)를 통과 한 두 번째 패스는 FirstPass의 값이 null입니다.

어떻게하면됩니까?

+0

MVC로 WebForm을 다시 만들려고하는 것 같아서 옳은 길은 아닙니다. MVC는 무국적자입니다. 사용자가 데이터를 어딘가에 보관하지 않는 한, 사용자가 이미 게시 한 내용을 '기억'하지 않습니다. 뷰백을 과도하게 사용하는 대신 모델 바인딩을 살펴보고 다른 컨트롤러를 사용해야합니다. 같은 URL을 통해 모든 것을 강제로 시도하지 마십시오 또는 [이 함정] (http://37signals.com/svn/posts/2316-so-much-complexity-in-software-comes-from)로 떨어질 수 있습니다. . – Nick

+0

나는 그것을 얻는다. .. 그러나이 앱의 90 %는 직선적 인 MVC CRUD 기능이며 MVC는 거기에 잘 들어 맞는다. 이 한 페이지에서는 모델 업데이트를하기 전에 필요한 세부 정보를 수집하기 위해 사용자에게 몇 가지 단계를 안내해야합니다. – davecove

답변

0

그런 경우 MVC에서 마법사를 구현하는 모범 사례를 살펴보십시오. 일부 good suggestions here. 개인적으로 나는 분리 된 별개의 URL을 사용하는 것을 여전히 고려할 것입니다. 또한 솔루션에 db 액세스 권한이있는 경우 주 모델을 업데이트하기 전에 임시 데이터를 저장할 수 있습니다. 사용자가 처음으로 전체 여행을 완료하지 않은 경우 어떤 일이 일어나길 원하는지 생각해보십시오.

관련 문제