MVC嵌套模型集合

时间:2014-07-07 15:32:56

标签: 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; }
 }

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

@foreach (Child c in Model.Childs)
{
    @c.Name 
}

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

@Html.DisplayFor(model => model.Childs)

并定义了以下视图:

@model WebApplication1.Models.Child

<div>
      @Html.DisplayFor(model => model.Name)
</div>

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

除了上述内容之外,我还想对@Html.EditorFor(model => model.Childs)使用类似的东西。

3 个答案:

答案 0 :(得分:5)

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

@foreach (Child c in Model.Childs)
{
    @Html.Partial("ChildViewName", c)
}

答案 1 :(得分:5)

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

<强> Child.cshtml

@model WebApplication1.Models.Child

@Model.Name
...more HTML markup if needed

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

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

答案 2 :(得分:1)

添加我的评论作为上述答案的扩展,因为我认为很多asp.net mvc的新手都会错过这个。 @panais提到我的评论帮助了他\她。所以,我认为它也可能对其他人有所帮助。

  1. 应在EditorTemplates文件夹中创建编辑器模板视图。
  2. 应在DisplayTemplates文件夹中创建显示模板视图。
  3. 模板视图的名称应与视图模型名称相同。