我知道已有其他线索。我一直在读它们。这就是我所拥有的:
namespace Books.Entities
{
public enum Genre
{
[Display(Name = "Non Fiction")]
NonFiction,
Romance,
Action,
[Display(Name = "Science Fiction")]
ScienceFiction
}
}
型号:
namespace Books.Entities
{
public class Book
{
public int ID { get; set; }
[Required]
[StringLength(255)]
public string Title { get; set; }
public Genre Category { get; set; }
}
}
然后,在视图中:
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Category)
</td>
</tr>
我认为框架会自动使用DisplayName属性。看起来很奇怪,它没有。但是无所谓。试图通过扩展来克服这个问题(在同一问题的另一个线程中找到了这个)......
using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
public static class EnumExtensions
{
public static string GetDisplayName(this Enum enumValue)
{
return enumValue.GetType()
.GetMember(enumValue.ToString())
.First()
.GetCustomAttribute<DisplayAttribute>()
.GetName();
}
}
看起来应该可行,但是当我尝试使用它时:
@Html.DisplayFor(modelItem => item.Category.GetDispayName())
我收到此错误:
{"Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions."}
答案 0 :(得分:4)
您可能想要考虑的一件事是为Enum添加一个DisplayTemplate,而您的@Html.DiplayFor()
将使用此功能。
如果您在名为~/Views/Shared
的{{1}}文件夹中创建了一个文件夹,请添加一个名为Enum.cshtml的新视图,并将此代码添加到视图中
DisplayTemplates
然后,您只需在其他视图中使用@model Enum
@{
var display = Model.GetDisplayName();
}
@display
。
顺便说一句,如果没有描述属性,您的@Html.DisplayFor(modelItem => item.Category)
代码将抛出错误,因此您可能希望使用类似
GetDisplayName
答案 1 :(得分:2)
好的,找到了几种方法来解决这个问题。首先,正如mxmissile建议的那样,只需使用:
@item.Category.GetDisplayName()
原来错误消息告诉我我需要知道的确切内容。我只是不知道@ Html.DisplayFor()是一个模板,我不能将它与帮助扩展一起使用。
但是,一个更好的解决方案原来是我在这里找到的:
http://www.codeproject.com/Articles/776908/Dealing-with-Enum-in-MVC
在此解决方案中,作者提供了一个显示模板,默认情况下对所有枚举都有效,而不必使用GetDisplayName()。有了这个解决方案,原始代码就可以了:
@Html.DisplayFor(modelItem => item.Category)
此外,默认情况下,它将全面运作。
(注意:这是假设您使用的是MVC5.x)