2017-09-03 14 views
1

我想顯示一個索引樣式視圖,其中包含一個HTML表格,該表格由我的@modelList<MyViewModel>填充。ASP.NET MVC核心 - 在視圖中顯示Enum屬性(與DropDownList無關)

MyViewModel類有一個名爲狀態屬性,這是我一直像這樣定義的自定義枚舉:

public enum MarketingEmailStatus 
{ 
    Queued, 
    Sending, 
    Sent 
} 

當我試圖在我看來,像這樣以顯示屬性...

 ... 

     @foreach (var item in Model) 
     { 
      <tr> 
       <td> 
        @Html.DisplayForModel(modelItem => item.Status) 
       </td> 
     ... 

我得到一個錯誤(無論是在智能感知,並在運行時間):

Cannot convert lambda expression to type 'object' because it is not a delegate type

我試圖做item.Status.ToString()無濟於事。

毫無疑問,我可以採取一種替代方法(即,只需更改ViewModel以表示狀態爲字符串,並在發送到視圖之前解決此問題),但這種感覺就像是一個簡單的場景,它應該是可能。然而,經過一個小時的搜索,我還沒有找到任何解決方案(除了那些與DropDownLists有關的解決方案,其中似乎有一些@Html幫助器方法可用。)

回答

1

我看到兩個問題直接使用@ item.Status:

  • 它不會尊重這些枚舉的「顯示值」例如代替 「代碼示例」,它將顯示「CodeSample」。

  • 它沒有考慮到本地化。

This看起來像這樣一個非常有前途的解決方案,在我看來這樣的場景。

可以很明顯的只使用擴展方法,如果第2點是不是下面您的關注:

public static class EnumExtensions 
{ 
    public static string GetDisplayName(this Enum enumValue) 
    { 
     FieldInfo fi = enumValue.GetType().GetField(enumValue.ToString()); 
     var displayAttribute = fi.CustomAttributes.FirstOrDefault(c => c.AttributeType == typeof(DisplayAttribute)); 
     if (displayAttribute == null) return enumValue.ToString(); 
     return displayAttribute.NamedArguments.FirstOrDefault(a => a.MemberName == "Name").TypedValue.Value.ToString(); 
    } 
} 
0

在ASP.NET Core中,尤其是在我自己的Web應用程序—從ASP.NET Core 2.0開始,我們都在不斷地升級—我所做的只是使用了Model的變量名,並在其上做了@,ASP.NET Core 2.0負責處理其餘的部分。對我而言,這很令人驚訝,至於爲什麼你仍然使用這些幫助器,而不是ASP.NET提供的最好的幫助器。 :-)是的,對於select元素,有一個特殊的ASP.NET Core標籤助手,它採用該模型,並且在簡單文本顯示的情況下,您可以執行@propertyName,它將爲您正確編寫。

讓我與您分享必要模型內容,

public class Foo { 
    // Other properties 
    public int Views { get; set; } 
    public PostType PostType { get; set; } 
    // Other properties. 
} 

枚舉是這樣的,

public enum PostType { Article, Video, CodeSample, Ebook, Other } 

現在,查看網頁上我的拍攝模式後,以下,

<!-- Content here. --> 
<p>@post.PostType has @post.Views views.</p> 
<!-- Content here. --> 

在那裏,它會自動打印包含枚舉值的字符串。

enter image description here

正如你可以看到,在該段的最後一行顯示文章有6次。這是我選擇的項目的迴應。 其他圖片中的內容可以忽略

現在,只是給出一個表的想法,這將完全工作—,它適用於我的儀表板面板在Web應用程序。

<table> 
    <tr> 
     <th>Id</th> 
     <th>Title</th> 
     <th>Status</th> 
    </tr> 
    @foreach (var item in Model) { 
     <tr> 
     <td>@item.Id</td> 
     <td>@item.Name</td> 
     <td>@item.Status</td> 
     </tr> 
    } 
</table> 

沒有必要把lambda表達式中這樣一個簡單的任務—我的意思是,沒有必要@Html幫手,因爲剃刀是夠了,太聰明。