2012-03-19 18 views
0

は、私は2つの関連POCOSASP.NET MVCでDropDownListForとTryUpdateModel

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かみそりビューを持っていますユーザが「None/Unknown」を選択した場合、コントローラ内の親オブジェクトの子値はnuである。ユーザが他の値を選択した場合(すなわち、データベースから取得された子オブジェクトのID)、親オブジェクトの子値がインスタンス化され、そのIDで設定されます。

基本的に、エンティティの1つが適切に再水和され、既定のモデルバインダーを介して割り当てられるように、HTTPステートレス境界を越えた可能なエンティティのリストを保持する方法には苦労しています。私はあまりにも多くを求めていますか?

答えて

1

私はあまりにも多くを求めていますか?

はい、あなたはあまりにも多くを求めています。

POSTリクエストで送信されるのは、選択したエンティティのIDです。それ以上のことは期待しないでください。あなたが再水和するか、あなたのデータベースを照会すべきものが何であれ。子コレクションに移入するGETアクションと同じ方法です。

あなたのPOSTアクションに問題があります。>デフォルトのモデルバインダーを2回呼びます。

[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); 
} 

か::

ここ

は2つの可能なパターン(個人的に私が最初にいますが、手動でデフォルトのモデルバインダーを呼び出したいときに、第2は、同様にいくつかの状況で有用であるかもしれないを好む)です ​​

あなたのコードでは、2つの組み合わせが間違っています。基本的には、デフォルトのモデルバインダーを2回呼び出しています。