簡體   English   中英

ASP.NET MVC 3:具體實現的輸出特定視圖

[英]ASP.NET MVC 3: Output specific view for concrete implementation

我有一個基本類型的IEnumerable作為我的模型。

我需要根據具體的類型在列表中顯示不同的HTML。

因此,結果列表在HTML中可能看起來與此類似:

<ul>
  <li class="points">Points - Item 1 - 10 points <a href="#">Remove</a></li>
  <li class="media">Media - Item 2 - your_uploaded_image.jpg <a href="#">Remove</a></li>
  <li class="content">Content - Item 3 <a href="#">Remove</a></li>
</ul>

稍后我可能會在此類型中添加其他類型,因此如下所示的解決方案並不是我真正想要的。

@foreach(var item in Model)
{
   if(item is PointImpl)
   {
       var pointItem = item as PointImpl;
       <li class="points">Points - @pointItem.Name - @pointItem.Points points <a href="#">Remove</a></li>
   }
   else if(item is MediaImpl)
   {
       var mediaItem = item as MediaImpl; 
       <li class="media">Media - @mediaItem.Name - @mediaItem.FileName  <a href="#">Remove</a></li>
   }
   /*
       More implementations
   */
}

我看過模型元數據模板提示,但這並沒有幫助,因為我的模型是IEnumerable。

我當時正在考慮一個自定義的HTML助手,它正在查看具體類型的屬性,但是認為可能有一種內置的方式嗎?

不用難看的foreach只需使用顯示模板即可:

@model IEnumerable<SomeBaseViewModel>
<ul>
    @Html.DisplayForModel()
</ul>

然后為所有子類型定義顯示模板。 例如:

~/Views/Shared/DisplayTemplates/PointImpl.cshtml

@model PointImpl
<li class="points">
    Points - @Model.Name - @Model.Points points 
    <a href="#">Remove</a>
</li>

和: ~/Views/Shared/DisplayTemplates/MediaImpl.cshtml

@model MediaImpl
<li class="media">
    Media - @Model.Name - @Model.FileName 
    <a href="#">Remove</a>
</li>

參見,沒有更多的if,沒有更多的循環,沒有更多的var。 一切都按慣例進行(模板必須位於~/Views/Shared/DisplayTemplates~/Views/SomeController/DisplayTemplates文件夾中,並應命名為具體類型的名稱PointImpl.cshtmlMediaImpl.cshtml ,... )。 根據具體類型,將呈現相應的顯示模板,並且將自動對主模型集合的每個元素進行呈現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM