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,然后让框架为所有项目集合生成编辑器。

myOtherClass为at创建 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 回答