2013-04-09 55 views
1

我对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; } 
    /... 
} 

使用脚手架,我创建了控制器和所有视图。但是,我想在同一页面中注册所有详细信息,即在BuildingPermitCreate视图中创建Applicant类型的细节Person,ApplicationArea类型Area等。有什么办法可以做到这一点?

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

我很感谢您的帮助。

回答

1

你可以通过创建人,面积,业主的编辑模板,实现这一目标等在:

~/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 
+0

令人惊叹。我是否可以复制Person的“编辑”或“创建”模板等等到“EditorTemplates”文件夹?如果是这样,我应该复制哪一个? – 2013-04-09 09:19:10

+0

还有一个问题。我复制并编辑了Person的“创建”视图,并将@ Html.EditorFor ...添加到了视图中,并且它工作正常。但是,我不确定创建请求的工作原理。我的意思是,当我单击父视图的提交按钮(上面的'BuildingPermit')时,它是否会自动发布并保存所有表的所需信息?或者我应该手动处理? – 2013-04-09 09:26:10

+0

脚手架文件将被设置为发布到您的控制器。您将要删除'@ Html.BeginForm()'和任何创建或编辑标题。您的模板应该只包含显示模板所需的内容,例如'@ Html.LabelFor()','@ Html.TextBoxFor()','@ Html.ValidationMessageFor()'等等。 – 2013-04-09 09:31:20

0

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

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

然后在您的控制器的操作方法创建模型的实例,并把它传递到您的视图:

​​

对于视图:

@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模板。从你在原文中提到的内容来看,这可能也是你正在寻找的东西。

希望这会有所帮助。

+0

谢谢。在这种方法和@Macs建议的方法之间哪一种方法更“正式”? – 2013-04-09 09:20:04

+1

@Macs是一个非常好的答案,它是使用'EditorFor'模板的一个很好的描述,它似乎是你正在寻找的。两种方法都是有效的方法,但如果要在其他视图中编辑/显示Person,Area和Owner对象,则“EditorFor”解决方案为您提供更大的灵活性。 – 2013-04-09 11:35:04

相关问题