具有枚举字符串值的 EnumDropDownListFor
EnumDropDownListFor with Enum string value
我有一个像这样的枚举:
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
函数,但没有更好的解决方案?
您可以使用 Enum.GetNames
将枚举的所有值作为字符串获取。然后,您会将此列表传递到模型中,并使用 @Html.DropDownListFor(x => x.Test, new SelectList(Model.Values))
.
创建下拉列表
你可以在下面看到这个fiddle:https://dotnetfiddle.net/ynK4ss
您可以按照 Andy 的建议创建一个 SelectList
,或者您可以创建一个带有 getter 的 StateString
属性:
public StateEnum State { get; set; }
public string StateString
{
get { return State.ToString(); }
}
或者如果 State
是字符串 属性,则在 EnumDropDownListFor
中绑定 StateEnum
并将模型更改为:
public StateEnum StateEnum { get; set; }
public string State
{
get { return StateEnum.ToString(); }
}
我用安迪的答案写了一个帮助程序,但不确定这是最好的方法。如果任何机构有更好的解决方案
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);
}
我有一个像这样的枚举:
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
函数,但没有更好的解决方案?
您可以使用 Enum.GetNames
将枚举的所有值作为字符串获取。然后,您会将此列表传递到模型中,并使用 @Html.DropDownListFor(x => x.Test, new SelectList(Model.Values))
.
你可以在下面看到这个fiddle:https://dotnetfiddle.net/ynK4ss
您可以按照 Andy 的建议创建一个 SelectList
,或者您可以创建一个带有 getter 的 StateString
属性:
public StateEnum State { get; set; }
public string StateString
{
get { return State.ToString(); }
}
或者如果 State
是字符串 属性,则在 EnumDropDownListFor
中绑定 StateEnum
并将模型更改为:
public StateEnum StateEnum { get; set; }
public string State
{
get { return StateEnum.ToString(); }
}
我用安迪的答案写了一个帮助程序,但不确定这是最好的方法。如果任何机构有更好的解决方案
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);
}