2012-03-19 3 views
0

내가 가지고있는 두 개의 관련 포항 강판DropDownListFor 및 TryUpdateModel MVC

public class Parent 
{ 
    public Guid Id {get; set;} 
    public IList<Child> ChildProperty {get; set;} 
} 

public class Child 
{ 
    public Guid Id {get; set;} 
    public String Name {get; set;} 
} 

내가 내 컨트롤러에서 다음을 수행하고 싶습니다 내가

<div> 
    @{ 
     var children = 
      new SelectList(Child.FindAll(), "Id", "Name").ToList(); 
    } 
    @Html.LabelFor(m => m.Child) 
    @Html.DropDownListFor(m => m.Child.Id, , children, "None/Unknown") 
</div> 

과 .cshtml 면도기보기가 클래스 :

[HttpPost] 
public ActionResult Create(Parent parent) 
{ 
    if (TryUpdateModel(parent)) 
    { 
     asset.Save(); 
     return RedirectToAction("Index", "Parent"); 
    } 

    return View(parent); 
} 

사용자가 "없음/알 수 없음"을 선택하면 컨트롤러의 부모 개체의 자식 값이 nu입니다. 그러나 사용자가 임의의 다른 값 (즉, 데이터베이스에서 검색된 하위 개체의 ID) 부모 개체의 자식 값이 인스턴스화되고 해당 ID로 채워집니다.

는 기본적으로 나는 개체 중 하나가 제대로 재수 기본 모델 바인더를 통해 할당되도록 HTTP 상태 비 경계에서 가능한 개체의 목록을 유지하는 방법과 사투를 벌인거야. 나는 단지 너무 많은 것을 요구하고 있는가? 난 그냥 너무 많이 요구

답변

1

건가요?

예, 너무 많이 요구하고있다.

POST 요청과 함께 보낸 모든 것은 선택된 항목의 ID입니다. 그 이상을 기대하지 마십시오. 당신이 rehydrate하거나 당신이 당신의 데이타베이스를 질문해야하는 무엇 이건을 원하는 경우에. GET 액션에서 자식 컬렉션을 채우는 것과 같은 방법입니다.

아, POST 동작에 문제가 있습니다.> 기본 모델 바인더를 두 번 호출하고 있습니다.

[HttpPost] 
public ActionResult Create(Parent parent) 
{ 
    if (ModelState.IsValid) 
    { 
     // The model is valid 
     asset.Save(); 
     return RedirectToAction("Index", "Parent"); 
    } 

    // the model is invalid => we must redisplay the same view. 
    // but for this we obviously must fill the child collection 
    // which is used in the dropdown list 
    parent.ChildProperty = RehydrateTheSameWayYouDidInYourGetAction(); 
    return View(parent); 
} 

또는 : 여기

는이 가능한 패턴 (개인적으로 내가 처음하지만 두 번째뿐만 아니라 수동 기본 모델 바인더를 호출 할 때 일부 상황에서 유용 할 수 있습니다 선호)이다

[HttpPost] 
public ActionResult Create() 
{ 
    var parent = new Parent(); 
    if (TryUpdateModel(parent)) 
    { 
     // The model is valid 
     asset.Save(); 
     return RedirectToAction("Index", "Parent"); 
    } 

    // the model is invalid => we must redisplay the same view. 
    // but for this we obviously must fill the child collection 
    // which is used in the dropdown list 
    parent.ChildProperty = RehydrateTheSameWayYouDidInYourGetAction(); 
    return View(parent); 
} 

코드에서 두 가지를 잘못 조합했습니다. 기본적으로 기본 모델 바인더를 두 번 호출합니다.

관련 문제