1

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

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:我的下一个问题将涉及如何让编辑视图显示一个多选滚动列表,其中列出了功能表中的所有项目,其中当前相机的功能项目已被选中。

4

2 回答 2

0

只需使用 DisplayTemplate。

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

@model Feature

<li>@Model.Desc</li>

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

<ul>
     @Html.DisplayFor(e => e.Features)
</ul>
于 2013-08-10T20:54:54.523 回答
0

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

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

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 vs IEnumearable 是必要的,因为 IEnumerable 只允许列表浏览,而 ICollection 定义了实体框架内部使用的 CopyTo 方法。

于 2013-08-10T20:35:39.150 回答