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

使用脚手架,我创建了控制器和所有视图。但是,我想在同一页面中注册所有详细信息,这意味着在BuildingPermit'sCreate视图中,为Applicantof type PersonApplicationAreaof typeArea等创建详细信息。有什么办法可以做到这一点吗?

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

我会很感激你的帮助。

4

2 回答 2

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
于 2013-04-09T09:00:45.553 回答
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" />

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

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

希望这可以帮助。

于 2013-04-09T08:55:37.590 回答