我有一个像这样的类的模型
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:我的下一个问题是如何让编辑视图显示一个多选滚动列表,列出功能表中所有项目,其中已选择当前相机的功能项目。
答案 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>