MVC嵌套模型集合

pan*_*ais 4 c# asp.net-mvc entity-framework

我是MVC的新手,我正在尝试从页面上的嵌套模型集合中显示信息.

所以我的模型如下:

public partial class Parent
{
    public Parent()
    {
        this.Childs = new HashSet<Child>();
     }

    public int ParentID { get; set; } 
     public string Name { get; set; } 

    public virtual ICollection<Child> Childs { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

要在我使用的父视图上显示信息:

@foreach (Child c in Model.Childs)
{
    @c.Name 
}
Run Code Online (Sandbox Code Playgroud)

上面的工作,但我想为孩子们使用不同的视图,所以我尝试了以下内容:

@Html.DisplayFor(model => model.Childs)
Run Code Online (Sandbox Code Playgroud)

并定义了以下视图:

@model WebApplication1.Models.Child

<div>
      @Html.DisplayFor(model => model.Name)
</div>
Run Code Online (Sandbox Code Playgroud)

这不起作用,我得到的是显示System.Data.Entity.DynamicProxies而不是子名称列表.我已经读过这是因为MVC5不知道要使用什么视图.我已经尝试在显示中指定视图, @Html.DisplayFor(model => model.Childs, "ViewName1.cshtml")但这根本没有帮助.

除了上面我想用类似的东西@Html.EditorFor(model => model.Childs).

Dav*_*idG 5

您需要告诉Razor每个子对象使用哪个视图.像这样的东西(显然用ChildViewName你的子视图的名称替换):

@foreach (Child c in Model.Childs)
{
    @Html.Partial("ChildViewName", c)
}
Run Code Online (Sandbox Code Playgroud)


dom*_*dom 5

首先DisplayTemplatesParent视图文件夹中创建子文件夹.然后在该文件夹中创建一个名为的视图Child.cshtml.

Child.cshtml

@model WebApplication1.Models.Child

@Model.Name
...more HTML markup if needed
Run Code Online (Sandbox Code Playgroud)

然后你所做的只是调用@Html.DisplayFor(m => m.Childs),框架将为你完成剩下的工作.请注意,如果使用允许指定要使用的视图的重载,则不会自动为您完成循环.

对编辑器模板重复相同的过程,使用EditorTemplates文件夹并遵循相同的约定(视图名称=类型名称)来命名视图.