C# 使用枚举填充DropDownListFor
我在MVC中有这样的模型:C# 使用枚举填充DropDownListFor,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我在MVC中有这样的模型: public partial class Magazine { public int Id { get; set; } public int MagYear { get; set; } public int MagNo { get; set; } public string MagSeason { get; set; } public string MagYear2 { get; set; } }
public partial class Magazine
{
public int Id { get; set; }
public int MagYear { get; set; }
public int MagNo { get; set; }
public string MagSeason { get; set; }
public string MagYear2 { get; set; }
}
我想看到MagSeason有一个DropDownlist for,并填充了一个
Enum Season
{
Spring =0,
Summer =1,
Autumn =2,
Winter=3
}
我该怎么做呢?开始编写自定义html帮助程序,如下文所述,并根据需要更改模板 枚举 看法 然后是助手
[AttributeUsage(AttributeTargets.Field)]
public class EnumDisplayNameAttribute : System.ComponentModel.DisplayNameAttribute
{
/// <summary>
/// Sets the display name for an Enum field
/// </summary>
/// <param name="displayName">The display name value to use</param>
public EnumDisplayNameAttribute(string displayName)
: base(displayName)
{
}
}
public static class HtmlHelperExtensions
{
public static MvcHtmlString EnumDropDownList<TEnumType>(this HtmlHelper htmlHelper, string name, TEnumType value)
{
var selectItems = GetSelectItemsForEnum(typeof(TEnumType), value);
return htmlHelper.DropDownList(name, selectItems);
}
public static MvcHtmlString EnumDropDownListPlaceholder<TEnumType>(this HtmlHelper htmlHelper, string name, TEnumType value, string placeholderName = null)
{
var selectItems = GetSelectItemsForEnum(typeof(TEnumType), value);
AddPlaceHolderToSelectItems(placeholderName, selectItems);
return htmlHelper.DropDownList(name, selectItems, new { @class = "placeholder" });
}
public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes = null) where TModel : class
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
throw new InvalidOperationException("Expression must be a member expression");
var name = ExpressionHelper.GetExpressionText(expression);
var fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
ModelState currentValueInModelState;
var couldGetValueFromModelState = htmlHelper.ViewData.ModelState.TryGetValue(fullName, out currentValueInModelState);
object selectedValue = null;
if (!couldGetValueFromModelState &&
htmlHelper.ViewData.Model != null)
{
selectedValue = expression.Compile()(htmlHelper.ViewData.Model);
}
var placeholderName = PlaceholderName(memberExpression);
htmlAttributes = ApplyHtmlAttributes(htmlAttributes, placeholderName);
var selectItems = GetSelectItemsForEnum(typeof(TProperty), selectedValue).ToList();
AddPlaceHolderToSelectItems(placeholderName, selectItems);
return htmlHelper.DropDownListFor(expression, selectItems, htmlAttributes);
}
public static MvcHtmlString PlaceholderDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, IDictionary<string, object> htmlAttributes = null)
where TModel : class
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
throw new InvalidOperationException("Expression must be a member expression");
IList<SelectListItem> list = selectList.ToList();
var placeholderName = PlaceholderName(memberExpression);
AddPlaceHolderToSelectItems(placeholderName, list);
htmlAttributes = ApplyHtmlAttributes(htmlAttributes, placeholderName);
return htmlHelper.DropDownListFor(expression, list, string.IsNullOrEmpty(optionLabel) ? null : optionLabel, htmlAttributes);
}
public static IList<SelectListItem> GetSelectItemsForEnum(Type enumType, object selectedValue)
{
var selectItems = new List<SelectListItem>();
if (enumType.IsGenericType &&
enumType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
enumType = enumType.GetGenericArguments()[0];
selectItems.Add(new SelectListItem { Value = string.Empty, Text = string.Empty });
}
var selectedValueName = selectedValue != null ? selectedValue.ToString() : null;
var enumEntryNames = Enum.GetNames(enumType);
var entries = enumEntryNames
.Select(n => new
{
Name = n,
EnumDisplayNameAttribute = enumType
.GetField(n)
.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
.OfType<EnumDisplayNameAttribute>()
.SingleOrDefault() ?? new EnumDisplayNameAttribute("")
})
.Select(e => new
{
Value = e.Name,
DisplayName = e.EnumDisplayNameAttribute.DisplayName ?? e.Name
})
.OrderBy(e => e.DisplayName)
.Select(e => new SelectListItem
{
Value = e.Value,
Text = e.DisplayName,
Selected = e.Value == selectedValueName
});
selectItems.AddRange(entries);
return selectItems;
}
public static IEnumerable<string> GetNamesForEnum(Type enumType, object selectedValue)
{
if (enumType.IsGenericType &&
enumType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
enumType = enumType.GetGenericArguments()[0];
}
var enumEntryNames = Enum.GetNames(enumType);
var entries = enumEntryNames
.Select(n => new
{
Name = n,
EnumDisplayNameAttribute = enumType
.GetField(n)
.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
.OfType<EnumDisplayNameAttribute>()
.SingleOrDefault() ?? new EnumDisplayNameAttribute("")
})
.Select(e => new
{
Value = e.Name,
DisplayName = e.EnumDisplayNameAttribute.DisplayName ?? e.Name
})
.OrderBy(e => e.DisplayName)
.Select(e => e.Value);
return entries;
}
static string PlaceholderName(MemberExpression memberExpression)
{
var placeholderName = memberExpression.Member
.GetCustomAttributes(typeof(EnumDisplayNameAttribute), true)
.Cast<EnumDisplayNameAttribute>()
.Select(a => a.DisplayName)
.FirstOrDefault();
return placeholderName;
}
static void AddPlaceHolderToSelectItems(string placeholderName, IList<SelectListItem> selectList)
{
if (!selectList.Where(i => i.Text == string.Empty).Any())
selectList.Insert(0, new SelectListItem { Selected = false, Text = placeholderName, Value = string.Empty });
if (!selectList.Any() || selectList[0].Text != string.Empty) return;
selectList[0].Value = "";
selectList[0].Text = placeholderName;
}
static IDictionary<string, object> ApplyHtmlAttributes(IDictionary<string, object> htmlAttributes, string placeholderName)
{
if (!string.IsNullOrEmpty(placeholderName))
{
if (htmlAttributes == null)
{
htmlAttributes = new Dictionary<string, object>();
}
if (!htmlAttributes.ContainsKey("class"))
htmlAttributes.Add("class", "placeholder");
else
{
htmlAttributes["class"] += " placeholder";
}
}
return htmlAttributes;
}
}
[AttributeUsage(AttributeTargets.Field)]
公共类EnumDisplayNameAttribute:System.ComponentModel.DisplayNameAttribute
{
///
///设置枚举字段的显示名称
///
///要使用的显示名称值
公共EnumDisplayName属性(字符串displayName)
:base(显示名称)
{
}
}
公共静态类HtmlHelperExtensions
{
公共静态MvcHtmlString EnumDropDownList(此HtmlHelper HtmlHelper、字符串名称、TEnumType值)
{
var-selectItems=getselectitemsforeum(typeof(TEnumType),value);
返回htmlHelper.DropDownList(名称,selectItems);
}
公共静态MvcHtmlString ENUMDROPDOLLINSTPLACEHOLDER(此HtmlHelper HtmlHelper,字符串名称,TEnumType值,字符串占位符名称=null)
{
var-selectItems=getselectitemsforeum(typeof(TEnumType),value);
将占位符添加到selectItems(占位符名称,selectItems);
返回htmlHelper.DropDownList(名称,selectItems,new{@class=“placeholder”});
}
公共静态MvcHtmlString EnumDropDownListFor(此HtmlHelper HtmlHelper,表达式,IDictionary htmlAttributes=null),其中TModel:class
{
var memberExpression=expression.Body作为memberExpression;
if(memberExpression==null)
抛出新的InvalidOperationException(“表达式必须是成员表达式”);
var name=ExpressionHelper.GetExpressionText(表达式);
var fullName=htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(名称);
ModelState当前值inmodelstate;
var couldGetValueFromModelState=htmlHelper.ViewData.ModelState.TryGetValue(全名,out currentValueInModelState);
objectselectedvalue=null;
如果(!couldGetValueFromModelState&&
htmlHelper.ViewData.Model!=null)
{
selectedValue=expression.Compile()(htmlHelper.ViewData.Model);
}
变量占位符名称=占位符名称(memberExpression);
HtmLatAttributes=ApplyHtmLatAttributes(HtmLatAttributes,占位符名称);
var selectItems=GetSelectItemsForEnum(typeof(TProperty),selectedValue).ToList();
将占位符添加到selectItems(占位符名称,selectItems);
返回htmlHelper.DropDownListFor(表达式、selectItems、htmlAttributes);
}
公共静态MvcHtmlString占位符DropDownList for(此HtmlHelper HtmlHelper、表达式表达式、IEnumerable selectList、字符串选项标签、IDictionary htmlAttributes=null)
其中TModel:class
{
var memberExpression=expression.Body作为memberExpression;
if(memberExpression==null)
抛出新的InvalidOperationException(“表达式必须是成员表达式”);
IList list=selectList.ToList();
变量占位符名称=占位符名称(memberExpression);
将占位符添加到选择项(占位符名称、列表);
HtmLatAttributes=ApplyHtmLatAttributes(HtmLatAttributes,占位符名称);
返回htmlHelper.DropDownListFor(表达式、列表、字符串.IsNullOrEmpty(optionLabel)?null:optionLabel、htmlAttributes);
}
公共静态IList GetSelectItemsForEnum(类型enumType,对象selectedValue)
{
var selectItems=new List();
如果(enumType.IsGenericType)&&
enumType.GetGenericTypeDefinition()==typeof(可为null))
{
enumType=enumType.GetGenericArguments()[0];
添加(新的SelectListItem{Value=string.Empty,Text=string.Empty});
}
var selectedValueName=selectedValue!=null?selectedValue.ToString():null;
var enumEntryNames=Enum.GetNames(enumType);
var entries=enumEntryNames
.选择(n=>new
{
Name=n,
EnumDisplayNameAttribute=enumType
.GetField(n)
.GetCustomAttributes(typeof(EnumDisplayNameAttribute),false)
第()类
.SingleOrDefault()??新的EnumDisplayNameAttribute(“”)
})
.选择(e=>new
{
值=e.名称,
DisplayName=e.EnumDisplayNameAttribute.DisplayName??e.Name
})
.OrderBy(e=>e.DisplayName)
.选择(e=>new SelectListItem
{
值=e.值,
Text=e.DisplayName,
Selected=e.Value==selectedValueName
});
选择Items.AddRange(条目);
返回选定的项目;
}
公共静态IEnumerable GetNamesForEnum(类型enumType,对象selectedValue)
{
如果(enumType.IsGenericType)&&
enumType.GetGenericTypeDefinition()==typeof(可为null))
{
enumType=enumType.GetGenericArguments()[0];
}
var enumEntryNames=Enum.GetNames(enumType);
var entries=enumEntryNames
.选择(n=>new
{
Name=n,
EnumDisplayNameAttribute=enumType
.GetField(n)
.GetCustomAttributes(typeof(EnumDisplayNameAttribute),false)
第()类
.SingleOrDefault()??新的EnumDisplayNameAttribute(“”)
})
.选择(e=>new
{
值=e.名称,
DisplayName=e.EnumDisplayNameAttribute.DisplayName??e.Name
})
.OrderBy(e=>e.DisplayName)
.选择(e=>e.Value);
返回条目;
}
静态字符串占位符名称(MemberExpression MemberExpression)
@Html.EnumDropDownListFor(m => m.Gender)
[AttributeUsage(AttributeTargets.Field)]
public class EnumDisplayNameAttribute : System.ComponentModel.DisplayNameAttribute
{
/// <summary>
/// Sets the display name for an Enum field
/// </summary>
/// <param name="displayName">The display name value to use</param>
public EnumDisplayNameAttribute(string displayName)
: base(displayName)
{
}
}
public static class HtmlHelperExtensions
{
public static MvcHtmlString EnumDropDownList<TEnumType>(this HtmlHelper htmlHelper, string name, TEnumType value)
{
var selectItems = GetSelectItemsForEnum(typeof(TEnumType), value);
return htmlHelper.DropDownList(name, selectItems);
}
public static MvcHtmlString EnumDropDownListPlaceholder<TEnumType>(this HtmlHelper htmlHelper, string name, TEnumType value, string placeholderName = null)
{
var selectItems = GetSelectItemsForEnum(typeof(TEnumType), value);
AddPlaceHolderToSelectItems(placeholderName, selectItems);
return htmlHelper.DropDownList(name, selectItems, new { @class = "placeholder" });
}
public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes = null) where TModel : class
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
throw new InvalidOperationException("Expression must be a member expression");
var name = ExpressionHelper.GetExpressionText(expression);
var fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
ModelState currentValueInModelState;
var couldGetValueFromModelState = htmlHelper.ViewData.ModelState.TryGetValue(fullName, out currentValueInModelState);
object selectedValue = null;
if (!couldGetValueFromModelState &&
htmlHelper.ViewData.Model != null)
{
selectedValue = expression.Compile()(htmlHelper.ViewData.Model);
}
var placeholderName = PlaceholderName(memberExpression);
htmlAttributes = ApplyHtmlAttributes(htmlAttributes, placeholderName);
var selectItems = GetSelectItemsForEnum(typeof(TProperty), selectedValue).ToList();
AddPlaceHolderToSelectItems(placeholderName, selectItems);
return htmlHelper.DropDownListFor(expression, selectItems, htmlAttributes);
}
public static MvcHtmlString PlaceholderDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, IDictionary<string, object> htmlAttributes = null)
where TModel : class
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
throw new InvalidOperationException("Expression must be a member expression");
IList<SelectListItem> list = selectList.ToList();
var placeholderName = PlaceholderName(memberExpression);
AddPlaceHolderToSelectItems(placeholderName, list);
htmlAttributes = ApplyHtmlAttributes(htmlAttributes, placeholderName);
return htmlHelper.DropDownListFor(expression, list, string.IsNullOrEmpty(optionLabel) ? null : optionLabel, htmlAttributes);
}
public static IList<SelectListItem> GetSelectItemsForEnum(Type enumType, object selectedValue)
{
var selectItems = new List<SelectListItem>();
if (enumType.IsGenericType &&
enumType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
enumType = enumType.GetGenericArguments()[0];
selectItems.Add(new SelectListItem { Value = string.Empty, Text = string.Empty });
}
var selectedValueName = selectedValue != null ? selectedValue.ToString() : null;
var enumEntryNames = Enum.GetNames(enumType);
var entries = enumEntryNames
.Select(n => new
{
Name = n,
EnumDisplayNameAttribute = enumType
.GetField(n)
.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
.OfType<EnumDisplayNameAttribute>()
.SingleOrDefault() ?? new EnumDisplayNameAttribute("")
})
.Select(e => new
{
Value = e.Name,
DisplayName = e.EnumDisplayNameAttribute.DisplayName ?? e.Name
})
.OrderBy(e => e.DisplayName)
.Select(e => new SelectListItem
{
Value = e.Value,
Text = e.DisplayName,
Selected = e.Value == selectedValueName
});
selectItems.AddRange(entries);
return selectItems;
}
public static IEnumerable<string> GetNamesForEnum(Type enumType, object selectedValue)
{
if (enumType.IsGenericType &&
enumType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
enumType = enumType.GetGenericArguments()[0];
}
var enumEntryNames = Enum.GetNames(enumType);
var entries = enumEntryNames
.Select(n => new
{
Name = n,
EnumDisplayNameAttribute = enumType
.GetField(n)
.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
.OfType<EnumDisplayNameAttribute>()
.SingleOrDefault() ?? new EnumDisplayNameAttribute("")
})
.Select(e => new
{
Value = e.Name,
DisplayName = e.EnumDisplayNameAttribute.DisplayName ?? e.Name
})
.OrderBy(e => e.DisplayName)
.Select(e => e.Value);
return entries;
}
static string PlaceholderName(MemberExpression memberExpression)
{
var placeholderName = memberExpression.Member
.GetCustomAttributes(typeof(EnumDisplayNameAttribute), true)
.Cast<EnumDisplayNameAttribute>()
.Select(a => a.DisplayName)
.FirstOrDefault();
return placeholderName;
}
static void AddPlaceHolderToSelectItems(string placeholderName, IList<SelectListItem> selectList)
{
if (!selectList.Where(i => i.Text == string.Empty).Any())
selectList.Insert(0, new SelectListItem { Selected = false, Text = placeholderName, Value = string.Empty });
if (!selectList.Any() || selectList[0].Text != string.Empty) return;
selectList[0].Value = "";
selectList[0].Text = placeholderName;
}
static IDictionary<string, object> ApplyHtmlAttributes(IDictionary<string, object> htmlAttributes, string placeholderName)
{
if (!string.IsNullOrEmpty(placeholderName))
{
if (htmlAttributes == null)
{
htmlAttributes = new Dictionary<string, object>();
}
if (!htmlAttributes.ContainsKey("class"))
htmlAttributes.Add("class", "placeholder");
else
{
htmlAttributes["class"] += " placeholder";
}
}
return htmlAttributes;
}
}
public static class EnumHelper
{
//Creates a SelectList for a nullable enum value
public static SelectList SelectListFor<T>(T? selected) where T : struct
{
return selected == null ? SelectListFor<T>()
: SelectListFor(selected.Value);
}
//Creates a SelectList for an enum type
public static SelectList SelectListFor<T>() where T : struct
{
Type t = typeof (T);
if (t.IsEnum)
{
var values = Enum.GetValues(typeof(T)).Cast<enum>()
.Select(e => new {
Id = Convert.ToInt32(e),
Name = e.GetDescription()
});
return new SelectList(values, "Id", "Name");
}
return null;
}
//Creates a SelectList for an enum value
public static SelectList SelectListFor<T>(T selected) where T : struct
{
Type t = typeof(T);
if (t.IsEnum)
{
var values = Enum.GetValues(t).Cast<Enum>()
.Select(e => new {
Id = Convert.ToInt32(e),
Name = e.GetDescription()
});
return new SelectList(values, "Id", "Name", Convert.ToInt32(selected));
}
return null;
}
// Get the value of the description attribute if the
// enum has one, otherwise use the value.
public static string GetDescription<TEnum>(this TEnum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
if (fi != null)
{
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes.Length > 0)
{
return attributes[0].Description;
}
}
return value.ToString();
}
}
//If you don't have an enum value use the type
ViewBag.DropDownList = EnumHelper.SelectListFor<MyEnum>();
//If you do have an enum value use the value (the value will be marked as selected)
ViewBag.DropDownList = EnumHelper.SelectListFor(myEnumValue);
@Html.DropDownList("DropDownList")