これについてはすでに他のスレッドがあることを知っています。私はそれらを読んできました。これが私が持っているものです:
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."}