2013-10-02 2 views
2

Мы знаем, что если мы определяем шаблон для базового типа, этот шаблон может также служить для производных типов (если какой-либо другой шаблон не использовался для его переопределения).Как создать шаблон редактора по умолчанию для перечислений в MVC 4?

Поскольку мы не можем наследовать Enum, ни enum s считается унаследовал от Enum, поэтому ни Enum.cshtml шаблона в Views\Shared\EditorTemplates не будет активен для различных пользовательских перечисляемых свойств объектов, как этот:

public enum Role 
{ 
    Admin, 
    User, 
    Guest 
} 

Я уже видел некоторые ответы на эту тему для ASP в целом, но мне интересно, если в MVC 4 есть некоторые улучшения по этому вопросу?

PS. Я имею в виду без использовать любой явный шаблон атрибуции (например, @Html.EditorFor(model => model.Role, "Enum") или [UIHint("Enum")])

ПФС. Я новичок в MVC, поэтому я буду благодарен за ваши простые ответы.

+0

Я немного запутался, что вы просите. Так просто определить шаблон редактора для Enum, т. Е. Enum.cshtml, недостаточно? – asymptoticFault

+0

apriori, недостаточно ... – Serge

+0

Не могли бы вы привести пример нужного сгенерированного html из вашего перечисления? –

ответ

6

K. Скотт Аллен имеет хороший article об этом.

+0

Это именно то, что я искал, большое спасибо! – Serge

+0

Хорошая статья. Но вам нужно включить типы модели перечисления типа «Nullable» – FindOutIslamNow

0

В MVC 5, вы можете добавить шаблон Views-> разделяемой> 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

Смежные вопросы