我有一个类似的枚举:
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 :(得分: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);
}