MVC3视图模型 - 包含列表的复杂对象列表

时间:2012-10-10 01:43:51

标签: c# asp.net-mvc-3 model model-binding

如何将这种复杂模型与包含多个对象的多个图层绑定? 现在我将模型传递给视图 - (填充表单/复选框树),我想要准确的模型(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; }
}

2 个答案:

答案 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