如何将这种复杂模型与包含多个对象的多个图层绑定? 现在我将模型传递给视图 - (填充表单/复选框树),我想要准确的模型(SubjectSelectionModel),但它没有正确绑定。
有人可以详细说明我需要采取的过程,以便在我看来正确绑定这些过程吗?
查看型号:
public class SubjectSelectionModel
{
public IList<Subject> Subjects { get; set; }
}
学科分类:
public class Subject
{
public String Name { get; set; }
public IList<Bin> Bins { get; set; }
public Subject()
{
}
public Subject(IList<Course> courses)
{
}
}
Bin Class:
public class Bin
{
public Subject Subject { get; set; }
public int Amount { get; set; }
public IList<Foo> Foos { get; set; }
}
Foo Class:
public class Foo
{
public int Number { get; set; }
}
答案 0 :(得分:5)
这是编辑器模板派上用场的地方。您可以使用简单的编辑器模板来处理所有繁琐的工作,而不是搞乱这一点。
您可以在〜/ Views / Shared / EditorTemplates中创建几个模板,然后在主视图中它应如下所示:
View.cshtml
@model SubjectSelectionModel
@using(Html.BeginForm()) {
@EditorFor(m => m.Subjects)
<input type="submit" />
}
Subject.cshtml
@model Subject
@Html.EditorFor(m => m.Name)
@Html.EditorFor(m => m.Bins)
Bin.cshtml(我假设您不想渲染主题,这将是一个无限循环)
@model Bin
@Html.EditorFor(m => m.Amount)
@Html.EditorFor(m => m.Foos)
Foo.cshtml
@model Foo
@Html.EditorFor(m => m.Number)
显然,您可能希望将html格式更改为您想要的任何内容,但基本上就是这样。
答案 1 :(得分:1)
您需要对象的for循环,以便MVC可以使用集合中的索引进行绑定。
示例:
for (int subjectIndex = 0; subjectIndex < Model.Subjects.Count; subjectIndex++) {
@Html.TextBoxFor(x => x.Subjects[subjectIndex].Name)
for (int binIndex = 0; binIndex < Model.Subjects.Bins.Count; binIndex++) {
@Html.TextBoxFor(x => x.Subjects[subjectIndex].Bins[binIndex].Amount)
}
}
...等。
我对类似的问题给出了类似的回答:Generating an MVC RadioButton list in a loop