2012-07-12 54 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