2013-05-01 2 views
3

우선 MVC에 익숙하지 않지만 프로젝트에서이 모델을 사용함에 따라이를 학습해야합니다.MVC 부분 뷰 컨트롤러에 모델 전달

현재 MVC에 대한 이해가 부족하여 문제가 발생합니다.

컨트롤러 : PersonController

모델 : PersonIndexModel PersonFindAddressModel (우편 번호, 가능한 주소 목록) PersonNewAddressModel (첫 번째 줄, 두 번째 줄, 우편 번호 여기에 내가 무엇을의 개요입니다)

보기 : RegisterAddress (부분보기를 모두 포함하는 PersonIndexModel 사용). FindAddress (PersonFindAddressModel 사용) NewAddress (PersonNewAddressModel 사용).

내가 등록하려고 할 때 사용자는 우편 번호를 넣습니다. html 제출 단추가 컨트롤러로 돌아가서 눌려진 단추의 이름을 확인하고 "우편 번호 찾기"인 경우 가능한 주소 목록을 다시 전달합니다 (PersonFindAddressModel 사용).

사용자가 주소가 목록에 없다고 선택하면 다시 이전과 같은 장소로 돌아가고 어떤 버튼이 눌러 졌는지 확인합니다 (이 경우 '주소를 찾을 수 없음'). '주소 찾기'를 숨 깁니다. '부분을 표시하고'새 주소 '부분을 표시합니다.

새 주소에는 정상적인 주소 양식과 제출할 버튼이 있습니다. PersonController에서 뭔가를 호출하기 위해 새로운 ActionLink를 만들려고했으나 그렇지 않습니다.

어디에서 잘못 될까요? 부분 데이터에는 컨트롤러가 있어야합니까?

여기에 내 코드, 더 구체적으로 :

RegisterAddress

@Html.Partial("FindAddress") 
@Html.Partial("NewAddress", new PersonNewAddressModel()) 

FindAddress

@model PersonFindAddressModel 
@using (Html.BeginForm("RegisterAddress", "Person")) 
{ 
if (@ViewBag.NewAddress != true) 
{ 
    @Html.TextBoxFor(m=> m.PostCode) 

    <button type="submit" value="findaddress" name="command">Find Address</button> 


    if (Model != null && Model.AddressList != null && Model.AddressList.Count > 0) 
    { 
     <div class="selectproperty"> 
      @Html.DropDownList("selectaddress", new SelectList(Model.AddressList, "value", "text")) 
     </div> 

     <div> 
      <button type="submit" value="notinlist" name="command"> Not in the list?</button> 
     </div> 
    } 

} 

새 주소

@model PersonNewAddressModel 

@{ 
    ViewBag.Title = "FindAddress"; 
} 

@using (Html.BeginForm("RegisterAddress", "Person")) 
{ 
if (@ViewBag.NewAddress == true) 
    { 
    @Html.TextBoxFor(m=> m.Street) 

    @Html.ActionLink("Submit", "SubmitNew") 
} 
} 

PersonController는

public class PersonController : Controller 
{ 
[HttpPost] 
    public ActionResult RegisterAddress(PersonFindAddressModel model, string command) 
    { 
     switch (command) 
     { 
      case "findaddress": 
       PostcodeLookup(model); 
       break; 

      case "notinlist": 
       ViewData.Add("NewAddress", true); 
       break; 

     } 

     return View(model); 
    } 

public ActionResult SubmitNew(PersonNewAddressModel model) 
    { 

     return View(model); 
    } 

어떤 도움을 주시면 감사하겠습니다!

답변

1

모든 기능에 동일한 컨트롤러를 사용할 수 있습니다. 부분품을 위해 별도의 컨트롤러가 필요하지 않습니다.

'버튼 하나를 눌렀을 때 버튼 이름이 결정됨'과 관련하여이 작업을 수행 할 필요가 없습니다. 각 버튼은 컨트롤러에서 다른 액션을 호출 할 수 있습니다.AddNewAddress보기 위해

public ActionResult FindAddress(PersonFindAddressModel model) 
{ 
    var address = PostcodeLookup(model); 

    // bind found address to PersonFindAddressModel 

    return View(model); 
} 

public ActionResult NotInList() 
{ 
    ViewData.Add("NewAddress", true); 
    return RedirectResult("Index"); 
} 

public ActionResult SaveAddress(PersonFindAddressModel model) 
{ 
    // save address from model and do any redirecting ect. 
} 

:

@model PersonNewAddressModel 

@using (Html.BeginForm("SubmitNewAddress", "Person")) 
{ 
    @Html.TextBoxFor(m => Model.Street) 
    <input type="submit" value="Add New" /> 
} 

을 그리고 SubmitNewAddress에 대한 액션을 추가 이들을위한

@model PersonFindAddressModel 
@using (Html.BeginForm("FindAddress", "Person")) 
{ 
    if (@ViewBag.NewAddress != true) 
    { 
     @Html.TextBoxFor(m => m.PostCode) 
     <input type="submit" value="Find" /> 
    } 
} 

if (Model.AddressList != null && Model.AddressList.Count > 0) 
{ 
    @using (Html.BeginForm("SaveAddress", "Person") 
    { 
     <div class="selectproperty"> 
      @Html.DropDownList("selectaddress", new SelectList(Model.AddressList, "value", "text")) 
     </div> 

     <div> 
      <input type="submit" value="Save" /> 
      @Html.ActionLink("Not in list","NotInList") 
     </div> 
    } 
} 

당신의 행동을 : 개인적으로, 나는 FindAddress보기에 두 가지 형태를 사용합니다 :

public ActionResult SubmitNew(PersonNewAddressModel model) 
{ 
    // save new address and redirect 
} 
+0

Th 많이 anks. 나는 당신의 제안을 살펴보고 그것을 시도하고 구현할 것입니다. –