ASP.net MVC3查看继承

时间:2012-07-12 19:27:43

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

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

车辆
  - 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车轮轮辋尺寸适用于汽车/卡车而非船只等......

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

最好用部分视图吗?我应该创建Usercontrols吗?

1 个答案:

答案 0 :(得分: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文件夹中查找此类型的相应显示模板,并通过将此模板作为模型传递给当前元素来自动呈现它。
  5. 你会注意到这种模式中有趣的东西:我非常使用 ASP.NET MVC 这个词而不是 .NET开发人员这个词。这很漂亮,因为开发人员必须遵循的标准是遵循标准约定,然后ASP.NET MVC将为他完成工作,这样开发人员就不需要编写循环,如果条件并不需要写,那么需要重新发明轮子。