1

私は MVC3 をそれほど長く使用しておらず、これは実際の問題ではなく、私の知識の欠陥だと思います。

いくつかの基本的なプロパティと内部オブジェクトのコレクションを持つオブジェクトがあります (簡易版):

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

2 に答える 2

3

子を手動で反復処理しないでください。エディタ テンプレートを定義してmyOtherClassから、フレームワークがすべてのアイテム コレクションのエディタを生成するようにする必要があります。

myOtherClassatの EditorTemplate を作成する~/Views/Shared/EditorTemplates/myOtherClass.cshtml

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

次に、親ビューで

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

これにより、コレクション内のすべてのアイテムのエディター テンプレートが内部的に呼び出され、モデル バインディング用の正しい入力名が生成されます。

于 2012-05-11T12:07:18.890 に答える
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
}
于 2012-05-11T12:31:24.903 に答える