如何在MVC 4中为枚举创建默认编辑器模板?

时间:2013-10-02 14:25:04

标签: c# asp.net-mvc templates asp.net-mvc-4 enums

我们知道,如果我们为基本类型定义模板,那么该模板也可以用于派生类型(如果没有使用任何其他模板来覆盖它)。

由于我们无法继承Enum,因此enum也不会继承Enum,因此Enum.cshtml中的Views\Shared\EditorTemplates模板都不会对于对象的不同自定义枚举属性,它们不会处于活动状态,如下所示:

public enum Role
{
    Admin,
    User,
    Guest
}

我已经在ASP中看到了关于这个主题的一些答案,但是我想知道在 MVC 4 中是否有一些关于这个主题的改进?

PS。我的意思是没有使用任何明确的模板归因(例如@Html.EditorFor(model => model.Role, "Enum")[UIHint("Enum")]

PPS。我是MVC的新手,所以我很感激你的答案。

3 个答案:

答案 0 :(得分:7)

ķ。斯科特艾伦对此有一个很好的article

答案 1 :(得分:1)

在MVC 5中,您可以向包含此代码的Views-> Shared-> EditorTemplates添加模板:

@model Enum
@{
    var optionLabel = ViewData["optionLabel"] as string;
    var htmlAttributes = ViewData["htmlAttributes"];
}
@Html.EnumDropDownListFor(m => m, optionLabel, htmlAttributes)

使用示例:

@Html.EditorFor(model => model.PropertyType, 
                new { 
                       htmlAttributes = new { @class = "form-control" },
                       optionLabel = "Select" 
                    })

在MVC 4中,你没有EnumDropDownListFor扩展名,但是你可以自己动手,我之前就是这样做的:

public static MvcHtmlString DropDownListFor<TModel, TEnum>
   (this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TEnum>> expression, 
    string optionLabel = null, object htmlAttributes = null)
{
    //This code is based on the blog - it's finding out if it nullable or not
    Type metaDataModelType = ModelMetadata
       .FromLambdaExpression(expression, htmlHelper.ViewData).ModelType;
    Type enumType = Nullable.GetUnderlyingType(metaDataModelType) ?? metaDataModelType;

    if (!enumType.IsEnum)
        throw new ArgumentException("TEnum must be an enumerated type");  


    IEnumerable<SelectListItem> items = Enum.GetValues(enumType).Cast<TEnum>()
       .Select(e => new SelectListItem
               {
                  Text = e.GetDisplayName(),
                  Value = e.ToString(),
                  Selected = e.Equals(ModelMetadata
                     .FromLambdaExpression(expression, htmlHelper.ViewData).Model)
               });

    return htmlHelper.DropDownListFor(
        expression,
        items,
        optionLabel,
        htmlAttributes
        );
}

参考文献:

http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum

http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc-creating-a-dropdownlist-helper-for-enums.aspx

答案 2 :(得分:0)

还有;有:

opensemanticsearch-delete --empty

角色当然是枚举:)