2

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

车辆
- VehicleId
- 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 Wheel rim size 适用于汽车/卡车而不是船等......

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

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

4

1 回答 1

9

使用显示模板。用以下代码行替换整个 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<Vehicle>
  2. ASP.NET MVC 开始枚举这个集合
  3. 对于集合的每个元素,ASP.NET MVC 查看其具体的运行时类型。
  4. ASP.NET MVC 为文件夹中定义的此类型查找相应的显示模板,~/Views/Shared/DisplayTemplates并通过将此模板作为模型传递给当前元素来自动呈现它。

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

于 2012-07-12T19:30:35.590 回答