【问题标题】:ASP.net MVC3 View inheritanceASP.net MVC3 视图继承
【发布时间】:2012-07-13 23:47:33
【问题描述】:

我有一个列表,例如我想在单个页面中呈现的车辆,但每种车辆类型具有不同的视图特征。

车辆
- 车辆 ID
- VehicleTypeId(汽车/船/卡车/等...)
- 说明
- ...

我想在我的主要 AllVehiclesPage 上

@foreach(var vehicle in Model) //where Model is a List<Vehicle> from AllVehicles
{
    //Render proper View
    //CarView(vehicle)
    //BoatView(vehicle)
    //TruckView(vehicle)
}

在每个视图中,它会根据车辆呈现不同的效果,IE 轮辋尺寸适用于汽车/卡车而不是船只等...

我在 Stackoverflow 上阅读了许多其他关于视图继承的问题,但它们似乎并不适用。

这最好与部分视图有关吗?我应该创建用户控件吗?

【问题讨论】:

    标签: asp.net-mvc .net-4.0


    【解决方案1】:

    使用显示模板。用以下代码行替换整个 foreach 循环:

    @model IEnumerable<Vehicle>
    ...
    @Html.DisplayForModel()
    

    现在是有趣的部分。您为要处理的每种类型定义显示模板:

    ~/Views/Shared/DisplayTemplates/Car.cshtml
    ~/Views/Shared/DisplayTemplates/Boat.cshtml
    ~/Views/Shared/DisplayTemplates/Truck.cshtml
    

    每个模板都会被强类型化为对应的具体类型。下面是Html.DisplayForModel() 行会发生的事情:

    1. ASP.NET MVC 发现模型是IEnumerable&lt;Vehicle&gt;
    2. ASP.NET MVC 开始枚举此集合
    3. 对于集合的每个元素,ASP.NET MVC 查看其具体的运行时类型。
    4. ASP.NET MVC 在~/Views/Shared/DisplayTemplates 文件夹中为定义的这种类型查找相应的显示模板,并通过将此模板作为模型传递给当前元素来自动呈现它。

    您会在此模式中注意到一些有趣的东西:我经常使用 ASP.NET MVC 这个词而不是 .NET 开发人员 这个词。这很不错,因为开发人员所要做的就是遵循标准约定,然后 ASP.NET MVC 将为他完成这项工作,因此该开发人员不需要编写循环,不需要编写 if 条件和不'不需要重新发明轮子。

    【讨论】:

    • 我还在学习MVC,这个链接是学习显示模板的好方法吗? bradwilson.typepad.com/blog/2009/10/…
    • 这绝对是一个很棒的学习场所。布拉德威尔逊是最伟大的人之一。
    • @DarinDimitrov 这只有在 OP 在他的抽象 Vehicle 对象和他的 Car/Boat/Truck 实现之间使用继承时才有效,但不是吗?在我看来,OP 实际上有一个 List 但想根据它的 VehicleTypeId 属性而不是对象的类型来选择要使用的模板。
    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多