MVC Enum DropDown - 动态负载

时间:2015-07-20 08:04:52

标签: asp.net-mvc asp.net-mvc-5.2

我试图使用Enum绑定MVC中的Dropdown并且效果很好!!这是示例代码

  //Enum Set up
    public enum Name
    {
    Name1,
    Name2,
    Name3
    }

    public enum Number
    {
    11,
    12,
    13
    }
    public Name nameDropDown { get; set; }

    public Number numberDropDown { get; set; }

    //Like this i have have 10 Enums

    //View
    @Html.EnumDropDownListFor(m => m.numberDropDown) or @Html.EnumDropDownListFor(m => m.nameDropDown)

这是我被击中的地方!!我将根据条件在我的视图中加载一个下拉列表。如果是,我可以根据条件加载下拉菜单。但是,由于我有大量的名单,它不会那么好。

有没有其他方法可以决定在我的视图中绑定哪个枚举?就像根据条件动态定位一样。请建议

1 个答案:

答案 0 :(得分:1)

没有简单的方法来实现这一目标。一种方法是创建一个扩展方法,如:

public enum Name { Name1, Name2, Name3 }
public enum Number {  Number1, Number2, Number3 }

public class ViewModel
{
    public Name nameDropDown { get; set; }
    public Number numberDropDown { get; set; }

    // x number of other enum properties
}

public static class MyHtmlHelpers
{
    public static MvcHtmlString MyEnumDropDownListFor(this HtmlHelper html, string propertyName)
    {
        var propertyInfo = typeof(ViewModel).GetProperty(propertyName);
        if (propertyInfo == null) return null;

        var expParam = Expression.Parameter(typeof(ViewModel)); 
        var expProp = Expression.Property(expParam, propertyName);
        var expression = Expression.Lambda(expProp, expParam);

        var htmlStr = (MvcHtmlString) typeof(SelectExtensions)
            .GetMethods()
            .First(m => m.Name == "EnumDropDownListFor" && m.IsGenericMethod)
            .MakeGenericMethod(typeof(ViewModel), propertyInfo.PropertyType)
            .Invoke(null, new object[] { html, expression });

        return htmlStr;
    }
}

您的视图可以从查询字符串中获取属性名称,并根据该显示下拉列表:

@model ViewModel

@{
   var propertyName = Request["property"] ?? "numberDropDown";
}

@Html.MyEnumDropDownListFor(propertyName)