2017-10-02 16 views
1

私のような列挙型を持っている:EnumDropDownListForは

public enum StateEnum 
{ 
    Updated = 0, 
    Pending = 1, 
    Failed = 2 
} 

ヘルパー関数@Html.EnumDropDownListFor(model => Model.State, "States")レンダリングされます。

<select id="State" name="State"> 
    <option value="0">Updated</option> 
    <option value="1">Pending</option> 
    <option value="2">Failed</option> 
</select> 

私の質問です:option値の列挙型の文字列値を持っていますか整数の代わりに属性?同様に:

<select id="State" name="State"> 
    <option value="Updated">Updated</option> 
    <option value="Pending">Pending</option> 
    <option value="Failed">Failed</option> 
</select> 

(それは次のページのURLに、よりユーザーフレンドリーになります)

私はHtmlHelperの拡張でHtml.EnumDropDownListFor機能を書き換えることができますが、何よりよい解決策はありませんか?

+0

をお持ちの場合は、必ず、各オプションの[値]属性を更新するためにはJavaScriptを使用して(または、独自の拡張メソッドを記述する)ことができ –

答えて

0

アンディのアンワースと、私はヘルパーを書いたが、それを行う最良の方法であるかどうかは分からない。すべてのボディは、よりよい解決策

public static MvcHtmlString EnumDropDownListWithStringFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, string optionLabel, object htmlAttributes) 
{ 
    var selectListItem = Enum.GetNames(Nullable.GetUnderlyingType(typeof(TEnum))).Select(p => new SelectListItem() { Value = p, Text = p }).ToList(); 
    return SelectExtensions.DropDownListFor(htmlHelper, expression, selectListItem, optionLabel, htmlAttributes); 
} 
2

Enum.GetNamesを使用すると、列挙型のすべての値を文字列として取得できます。このリストをモデルに渡すと、@Html.DropDownListFor(x => x.Test, new SelectList(Model.Values))を使用してドロップダウンが作成されます。アンディが提案されているようhttps://dotnetfiddle.net/ynK4ss

+0

おかげでそれが解決策だが、我々ならば、それは非常に無愛想することができモデルでいくつかの列挙型を持っている、私はヘルパー拡張子を書くことを好む – GGO

1

あなたはSelectListを作成することも、このようなゲッターとStateString性質を持つことができます:

次のフィドルでこれを見ることができますStateがある場合

public StateEnum State { get; set; } 

public string StateString 
{ 
    get { return State.ToString(); } 
} 

か文字列プロパティを入力し、にStateEnumをバインドし、モデルを次のように変更します。

​​
関連する問題