2015-07-20 41 views
1

我试图在MVC中使用Enum绑定下拉菜单,它工作的很棒!下面是示例代码MVC Enum 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

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

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)