3

これについてはすでに他のスレッドがあることを知っています。私はそれらを読んできました。これが私が持っているものです:

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."}  
4

2 に答える 2

4

検討したいことの 1 つは、Enum の DisplayTemplate を追加することであり、@Html.DiplayFor()これを使用します。

~/Views/Sharedというフォルダーにフォルダーを作成する場合は、DisplayTemplatesEnum.cshtml という新しいビューを追加し、このコードをビューに追加します。

@model Enum
@{
    var display = Model.GetDisplayName();
}
@display

@Html.DisplayFor(modelItem => item.Category)あとは、他のビューで使用するだけです。

ところで、GetDisplayName記述属性がない場合、コードはエラーをスローするため、次のようなものを使用することをお勧めします

public static string GetDisplayName(this Enum enumValue)
    {

        Type type = enumValue.GetType();
        string name = Enum.GetName(type, enumValue);
        if (name != null)
        {
            FieldInfo field = type.GetField(name);
            if (field != null)
            {
                DescriptionAttribute attr =
                       Attribute.GetCustomAttribute(field,
                         typeof(DescriptionAttribute)) as DescriptionAttribute;
                if (attr != null)
                {
                    return attr.Description;
                }
            }
        }
        return name;
    }
于 2015-10-02T15:40:14.957 に答える
2

わかりました、これを回避する方法がいくつか見つかりました。まず、mxmissileが提案したように、以下を使用します。

@item.Category.GetDisplayName()

エラーメッセージは、私が知る必要があることを正確に教えてくれました. @Html.DisplayFor() がテンプレートであることを理解していなかっただけで、ヘルパー拡張機能では使用できません。

しかし、より良い解決策は、私がここで見つけたものであることが判明しました:

http://www.codeproject.com/Articles/776908/Dealing-with-Enum-in-MVC

このソリューションでは、作成者は、GetDisplayName() を ass する必要なく、すべての列挙型に対して既定で機能する表示テンプレートを提供します。このソリューションを使用すると、元のコードは問題なく動作します。

@Html.DisplayFor(modelItem => item.Category)

さらに、デフォルトで全面的に機能します。

(: これはすべて、MVC5.x を使用していることを前提としています)

于 2015-10-02T15:39:33.447 に答える