在主视图中创建复杂模型的多个部分

时间:2013-04-09 08:29:27

标签: asp.net asp.net-mvc-4

我是ASP.Net MVC的新手,我有一个复杂的模型。

public class BuildingPermit
{
    public int ApplicationID { get; set; }
    public virtual Person Applicant { get; set; }
    public virtual Area ApplicantArea { get; set; }
    public virtual ICollection<Owner> Owners { get; set; }
    /...
}

使用脚手架,我创建了控制器和所有视图。但是,我想在同一页面中注册所有详细信息,这意味着在BuildingPermit的{​​{1}}视图中,创建CreateApplicant的详细信息,{类型为Person的{​​1}},依此类推。我有什么方法可以做到这一点吗?

如果不可能,我认为可以添加一个链接来创建对象。当用户点击它时,页面会转到该视图,创建它,获取其信息并在ApplicationArea的视图中显示它。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以通过在以下位置创建Person,Area,Owner等的编辑器模板来实现此目的:

~/Views/Shared/EditorTemplates/Person.cshtml
~/Views/Shared/EditorTemplates/Area.cshtml
~/Views/Shared/EditorTemplates/Owner.cshtml

编辑器模板需要强类型,并且应该为类型提供编辑器布局:

@model Models.Person
<h2>Person</h2> 
<p>
    @Html.LabelFor(model => model.Name)
    @Html.EditorFor(model => model.Name)
</p>
<p>
    @Html.LabelFor(model => model.Address)
    @Html.EditorFor(model => model.Address)
</p>
// And so on

完成此次调用后,@Html.EditorFor(model => model.Applicant)会选择您的模板并显示在“修改”视图中。

如果您想要同时显示所有这些信息,那么您可能还想为这些类型创建显示模板。这些工作就像编辑器模板一样,只是将模板保存在DisplayTemplates文件夹中。

~/Views/Shared/DisplayTemplates/Person.cshtml
~/Views/Shared/DisplayTemplates/Area.cshtml
~/Views/Shared/DisplayTemplates/Owner.cshtml

答案 1 :(得分:0)

这没问题,只要确保以某种方式初始化复杂对象以避免空引用异常:

public BuildingPermit()
{
    this.Applicant = new Person();
    this.ApplicantArea = new Area();
    ...
}

然后在您的控制器操作方法中创建模型的实例并将其传递给您的视图:

public ActionResult Create()
{
    BuildingPermit model = new BuildingPermit();

    View(model);
}

对于视图:

@model MyNamespace.BuildingPermit

@Html.LabelFor(m => m.Applicant.FirstName)<br />
@Html.TextBoxFor(m => m.Applicant.FirstName)<br />

...

<input type="submit" value="Create new building permit" />

然后在线查看有关如何在MVC控制器中处理HttpPost的示例。

如果要为每种对象类型创建特定的UI部分,则可以查看EditorForDisplayFor模板。从您在原始帖子中提到的内容来看,这可能也是您正在寻找的内容。

希望这有帮助。