2012-07-12 56 views
2

我有一个例子Vehicle的列表,我想要在一个页面中呈现,但每种车型都有不同的视图特征。ASP.net MVC3查看继承

车辆
- 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车轮轮辋尺寸适用于汽车/卡车不蟒ts等...

我读过关于视图继承Stackoverflow的其他问题,但他们似乎并不适用。

这是最好的与部分意见?我应该创建Usercontrols吗?

回答

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

你会发现在这个模式一些有趣的事情:我用的是ASP.NET MVC非常多,而不是.NET开发人员字。这很好,因为开发人员必须遵循标准约定,然后ASP.NET MVC将为他完成这项工作,以便该开发人员不需要编写循环,如果条件并不需要编写,不需要重新发明轮子。

+0

我还在学习MVC,请问这个链接是学习显示模板的好方法吗? http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html – 2012-07-12 19:35:35

+0

这绝对是学习的好地方。布拉德威尔逊是最伟大的人之一。 – 2012-07-12 19:36:22

+0

工作奇妙Darin,thx – 2012-07-13 15:46:39