MVC html 助手动态生成枚举下拉列表

MVC html helper to generate enum drop down list dynamiclly

我的模型是:

public class DynamicEnum
{
    public string Name {get; set;}
    public int Value {get; set;}
}

public class ViewModel
{
    public DynamicEnum DynamicEnum {get; set;}
}

Public ActionResult MyAction
{
    var model = new ViewModel();
    model.DynamicEnum = new DynamicEnum(){ Name = "System.DayOfWeek", Value = 2};
    return View(model);
}

所以在视图中我需要一个 HtmlHelper 来动态生成 DropDownListFor,例如:

@Html.EnumDropDownListFor(m => m.DynamicEnum)

我用的是 MVC 5.2.3,有人知道吗?

实现此目的的一种方法是使用反射:

public static class HtmlExtensions
{
    public static IHtmlString EnumDropDownListFor<TModel>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, DynamicEnum>> expression)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        var dynamicEnum = (DynamicEnum)metadata.Model;
        var enumType = Type.GetType(dynamicEnum.Name, true);
        if (!enumType.IsEnum)
        {
            throw new Exception(dynamicEnum.Name + " doesn't represent a valid enum type");
        }

        // TODO: You definetely want to cache the values here to avoid the expensive
        // reflection call: a ConcurrentDictionary<Type, IList<SelectListItem>> could be used
        var enumNames = Enum.GetNames(enumType);
        var values = enumNames.Select(x => new SelectListItem
        {
            Text = x,
            Value = ((int)Enum.Parse(enumType, x)).ToString(),
        }).ToList();

        string name = ExpressionHelper.GetExpressionText(expression) + ".Value";

        return html.DropDownList(name, values);
    }
}

备注:HtmlHelper.EnumDropDownListFor 扩展方法已存在于 ASP.NET MVC 中,因此请确保将声明自定义扩展方法的命名空间带入范围以避免冲突。或者只是使用不同的方法名称。