我试图使用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)
这是我被击中的地方!!我将根据条件在我的视图中加载一个下拉列表。如果是,我可以根据条件加载下拉菜单。但是,由于我有大量的名单,它不会那么好。
有没有其他方法可以决定在我的视图中绑定哪个枚举?就像根据条件动态定位一样。请建议
答案 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)