ASP.net MVC3查看继承

Nat*_*oop 2 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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dar*_*rov 9

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

@model IEnumerable<Vehicle>
...
@Html.DisplayForModel()
Run Code Online (Sandbox Code Playgroud)

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

~/Views/Shared/DisplayTemplates/Car.cshtml
~/Views/Shared/DisplayTemplates/Boat.cshtml
~/Views/Shared/DisplayTemplates/Truck.cshtml
Run Code Online (Sandbox Code Playgroud)

每个模板都将强类型化为相应的具体类型.所以这就是将要发生的事情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将做的工作为他感到这个开发人员无需编写循环,不需要写,如果条件和没有按"需要重新发明轮子.