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