我知道这个主题有几个主题。我看到了很多解决方案,但大多数解决方案需要了解枚举的类型。由于Enum默认渲染使用模板作为字符串,因此找出确切的类型更加困难。
有人有一个如何解决这个问题的完整例子吗?
编辑。根据Roys的建议,这是我的代码。
HtmlHelpers.cs
public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
{
var type = htmlHelper.ViewData.ModelMetadata.ModelType;
var inputName = type.Name;
var value = htmlHelper.ViewData.Model == null ? default(TProperty) : expression.Compile()(htmlHelper.ViewData.Model);
var selected = value == null ? String.Empty : value.ToString();
return htmlHelper.DropDownList(inputName, ToSelectList(type, selected));
}
private static IEnumerable<SelectListItem> ToSelectList(Type enumType, string selectedItem)
{
var items = new List<SelectListItem>();
foreach (var item in Enum.GetValues(enumType))
{
var fi = enumType.GetField(item.ToString());
var attribute = fi.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
var title = attribute == null ? item.ToString() : ((DescriptionAttribute)attribute).Description;
var listItem = new SelectListItem
{
Value = ((int)item).ToString(),
Text = title,
Selected = selectedItem == ((int)item).ToString()
};
items.Add(listItem);
}
return new SelectList(items, "Value", "Text");
}
视图模型
public class AddTestForm
{
[UIHint("Enum")]
public EnumType Type { get; set; }
public string Description { get; set; }
public enum EnumType
{
One = 1,
Two = 2
}
EditorTemplates / Enum.cshtml
@model object
@Html.EnumDropDownListFor(x => x)
在视图中......
@Html.EditorForModel()
现在的问题是,在表单发布后我无法填写枚举。
答案 0 :(得分:2)
您的助手会为生成的select
元素生成错误的名称:
<select id="Type_EnumType" name="Type.EnumType">
DefaultModelBinder
使用name属性来匹配属性名称。您的帮助程序生成的名称"Type.EnumType"
与模型属性名称"Type"
不匹配。要使其工作而不是类型名称,您需要从表达式中获取属性名称。使用ExpressionHelper类非常容易:
public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
{
...
return htmlHelper.DropDownList(ExpressionHelper.GetExpressionText(expression), ToSelectList(type, selected));
}