MVC 4:显示列表<>视图上的属性

时间:2013-08-10 20:07:01

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

我有一个像这样的类的模型

public class Feature
{
    public int ID { get; set; }
    public string Desc { get; set; }
    public List<Camera> { get; set; }
}

和这样的一个:

public class Camera
{
    public int ID { get; set; }
    public string ModelName { get; set; }
    public List<Feature> Features { get; set; }
}

我为相机模型制作了一个控制器和视图,并在其功能集合中添加了几个带有多个功能对象的相机。

然而,当我渲染相机视图(索引,细节,编辑)时,我在任何地方都看不到“功能”字段。在索引和详细信息视图中,我希望将Features集合中的项目视为多行文本,每行一个项目。

怎么样?

戴夫

PS:我的下一个问题是如何让编辑视图显示一个多选滚动列表,列出功能表中所有项目,其中已选择当前相机的功能项目。

2 个答案:

答案 0 :(得分:0)

没有来自控制器的任何代码很难说,但实体框架的一个非常常见的问题是忘记使用.Include()扩展方法。例如var cameras = db.Cameras.Include(c => c.Features).ToList();,它会为您提供要传递到视图的相机和相关要素的列表。

此外,如果将虚拟关键字添加到导航属性,则实体框架可以执行“延迟加载”,它会在第一次访问相关项目时自动加载(服务器端)。通常,大多数导航属性也将被定义为通用。 e.g:

public class Feature
{
    public int ID { get; set; }
    public string Desc { get; set; }

    public virtual ICollection<Camera> Cameras { get; set; }
}

public class Camera
{
    public int ID { get; set; }
    public string ModelName { get; set; }
    public virtual ICollection<Feature> Features { get; set; }
}

这允许您访问更大的扩展方法数组以进行过滤和排序。 IEnumerable描述了行为,而List是该行为的实现。当您使用IEnumerable时,您可以让编译器有机会将工作推迟到以后,可能会在此过程中进行优化。如果使用List,则强制编译器立即重新生成结果。在您的情况下,使用ICollection与IEnumearable是必要的,因为IEnumerable只允许列表浏览,而ICollection定义了Entity Framework内部使用的CopyTo方法。

答案 1 :(得分:0)

只需使用DisplayTemplate。

为此,请在〜/ Views / Shared / 中添加名为 DisplayTemplates 的文件夹,并添加名为 Feature.cshtml 的PartialView。在新创建的PartialView中添加以下代码:

@model Feature

<li>@Model.Desc</li>

然后在您的相机模型视图中,执行以下操作:

<ul>
     @Html.DisplayFor(e => e.Features)
</ul>