MVC3 Razor httppost返回复杂对象子集合

时间:2012-05-11 11:28:48

标签: asp.net-mvc-3 razor http-post

我没有长时间使用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);
}

2 个答案:

答案 0 :(得分:3)

您不应手动迭代子项,您应该为myOtherClass定义编辑器模板,然后让框架为所有项目集合生成编辑器。

myOtherClass

~/Views/Shared/EditorTemplates/myOtherClass.cshtml创建EditorTemplate
@model myOterClass
@Html.EditorFor(model => model.Name)
@Html.EditorFor(model => model.Age)

然后在父视图中

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

这将在内部调用集合中所有项目的编辑器模板,并为模型绑定生成正确的输入名称。

答案 1 :(得分: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
}