1

ViewModelsで列挙型を使用して、次のDropDownListForように設定しています。

@Html.DropDownListFor(model => model.SelectedDropDownValue, 
       new SelectList(Enum.GetValues(typeof(SearchOptions)), SearchOptions.SSN))

これはうまく機能します。ただし、列挙型内の各値に関連付けられているのDisplayNameプロパティを表示したいと思います。DisplayNameAttribute

Stackoverflowを検索し、ヘルパーや拡張機能などを使用してこれを行う方法をいくつか見てきました。このような1つのステートメント内で、?SelectListを使用するように簡単に指示することは可能DisplayNameAttributeですか?

私は次のようなことを考えています:

@Html.DropDownListFor(model => model.SelectedDropDownValue, 
                      new SelectList(Enum.GetValues(typeof(SearchOptions), 
                      "Value", GetDisplayAnnotation()), SearchOptions.SSN))
4

1 に答える 1

0

を探す以外は同じことをするコードをいくつか書きましたDescriptionAttribute

状況に合わせて変更すると、次のようになります。

public static string GetDescription(this Enum value)
{
    if (value == null)
        throw new ArgumentNullException("value");        

    var attribute = value.GetType()
        .GetField(value.ToString())
        .GetCustomAttributes(typeof(DisplayNameAttribute), false)
        .Cast<DisplayNameAttribute>()
        .FirstOrDefault();

    return attribute == null ? value.ToString() : attribute.DisplayName;
}

選択リストを作成@Html.DropDownListしてビューでを呼び出すのではなく、次のようなエディターと表示のテンプレートを作成しました(Enum.cshtmlと呼ばれます)。

var values = Enum.GetValues(enumType)
    .Cast<Enum>()
    .Select(v => new SelectListItem
    {
        Selected = v.Equals(Model),
        Text = v.GetDescription(),
        Value = v.ToString(),
    });

Html.DropDownList("", values)

次に、ViewModelsの列挙型プロパティをUIHint属性で装飾すると、列挙型プロパティは上記のコードを自動的に使用します。

public class MyViewModel
{
    [UIHint("Enum")]
    public MyEnumType MyProperty { get; set; }
}

null値、null許容型の処理、ドロップダウンへのデフォルトエントリの追加など、注意すべきいくつかのエッジケースがありますが、これにより、開始するための骨が折れるはずです。

于 2013-05-11T14:41:41.520 に答える