Asp.net mvc 3 MVC 3:用于EditorForModel的枚举下拉模板

Asp.net mvc 3 MVC 3:用于EditorForModel的枚举下拉模板,asp.net-mvc-3,enums,mvc-editor-templates,Asp.net Mvc 3,Enums,Mvc Editor Templates,我知道关于这个话题有好几条线索。我看到了很多解决方案,但其中大多数都需要了解枚举的类型。由于默认情况下Enum渲染使用字符串模板,因此更难找到确切的类型 有人有完整的例子来说明如何解决这个问题吗 编辑。根据罗伊斯的建议,这是我的密码 htmlhelp.cs public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expres

我知道关于这个话题有好几条线索。我看到了很多解决方案,但其中大多数都需要了解枚举的类型。由于默认情况下Enum渲染使用字符串模板,因此更难找到确切的类型

有人有完整的例子来说明如何解决这个问题吗

编辑。根据罗伊斯的建议,这是我的密码

htmlhelp.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");
}
EditorTemplates/Enum.cshtml

public class AddTestForm
{
    [UIHint("Enum")]
    public EnumType Type { get; set; }

    public string Description { get; set; }

public enum EnumType
{
    One = 1,
    Two = 2
}
@model object

@Html.EnumDropDownListFor(x => x)
并在视图中…

@Html.EditorForModel()

现在的问题是,我无法在发布表单后填充枚举。

您的助手为生成的
select
元素生成了错误的名称:

<select id="Type_EnumType" name="Type.EnumType">

看看这个:我更新了我的答案。也许你看到了一些明显的东西。
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));
}