EnumDropDownListFor与Enum字符串值

时间:2017-10-02 07:49:25

标签: asp.net-mvc html-helper

我有一个类似的枚举:

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函数,但没有更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

您可以使用Enum.GetNames将枚举的所有值作为字符串。然后,您可以将此列表传递到模型中,并使用@Html.DropDownListFor(x => x.Test, new SelectList(Model.Values))创建下拉列表。

您可以在以下小提琴中看到这一点:https://dotnetfiddle.net/ynK4ss

答案 1 :(得分:1)

你可以像Andy建议的那样创建一个SelectList,或者你可以拥有一个带有这样的getter的StateString属性:

public StateEnum State { get; set; }

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

State是字符串属性,然后在StateEnum中绑定EnumDropDownListFor并将模型更改为:

public StateEnum StateEnum { get; set; }

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

答案 2 :(得分:0)

在Andy的帮助下,我写了一个帮手,但不确定这是最好的方法。如果任何机构有更好的解决方案

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);
}