2012-05-11 14 views
1

私はMVC3をそれほど使用しておらず、実際の問題よりも自分の知識の欠陥だと思っています。MVC3 Razor httppost複雑なオブジェクトの子コレクションを返す

public class myClass 
{ 
    public string Name { get; set; } 
    public string Location { get; set; } 
    public List<myOtherClass> Children { get; set; } 
} 

public class myOtherClass 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

私は強く「MyClassの」オブジェクトにタイプされたビューを持っている:

は、私はいくつかの基本的な性質を持つオブジェクト、その後、内側のオブジェクトのコレクション、(簡易版)を持っています。名前と場所に@ html.editorforを使用し、子オブジェクトに対してforeachを使用します。 foreachではそれぞれのプロパティに対してeditorforを再度使用します。

ポストバック(httppostアクション)時に、myClassの名前と場所は記入されていますが、子リストは空です。

ビューをどのように作り、すべての子要素を確実に埋め込むようにするかはわかりません。

私は両方を試してみました:

[httppost] 
public actionresult myaction(myClass myclass) 
{ 
} 

と:

[httppost] 
public actionresult myaction() 
{ 
    myClass myclass = new myClass(); 
    TryUpdateModel(myclass); 
} 
+0

あなたはCHILDESためのループを作成する必要があります。私の下のサンプルを読む – Morteza

答えて

3

を手動で子供を反復処理するべきではありません、あなたはmyOtherClassのためのエディタのテンプレートを定義して、ちょうどフレームワークは、すべてのアイテムのコレクションのためのエディタを発生させてください。

は、親ビューに次に~/Views/Shared/EditorTemplates/myOtherClass.cshtml

@model myOterClass 
@Html.EditorFor(model => model.Name) 
@Html.EditorFor(model => model.Age) 

myOtherClassため

@Html.EditorFor(model => model.Children) 

をEditorTemplateを作成します。これは、内部コレクション内のすべてのアイテムのエディタテンプレートを呼び出し、モデルの結合のための正しい入力名を生成します。ビューの

2

@for (int i = 0; i < Model.Children.Count; i++) 
{ 
    <div class="editor-field"> 
    @Html.EditorFor(m => m.Children[i].Name) 
    </div> 

} 

とコントローラで:

public ActionResult Test() 
{ 
    var model = new myClass(); 
    model.Name = "name"; 
    model.Location= "loc"; 

    model.Children = new List<myOtherClass>(); 
    var child1 = new myOtherClass(); 
    child1.Name = "Name1"; 

    var child2 = new myOtherClass(); 
    child2.Name = "Name2"; 

    model.Children.Add(child1); 
    model.Children.Add(child2); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Test(myClass model) 
{ 
    //model.Children Has Value 
} 
関連する問題