具有枚举字符串值的 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);
}