ASP.NET MVC: использование EditorFor() с шаблоном по умолчанию для перечислений

Я написал помощник EnumDropDownFor(), который хочу использовать вместе с EditorFor(). Я только начал использовать EditorFor(), поэтому немного запутался в том, как выбирается шаблон.

Мой шаблон редактора Enum.cshtml приведен ниже:

<div class="editor-label">
    @Html.LabelFor(m => m)
</div>
<div class="editor-field">     
    @Html.EnumDropDownListFor(m => m)
    @Html.ValidationMessageFor(m => m)
</div>

За исключением явного определения используемого шаблона, есть ли способ иметь шаблон по умолчанию, который используется всякий раз, когда Enum передается в EditorFor()?


person ajbeaven    schedule 16.04.2011    source источник


Ответы (1)


Вы можете проверить сообщение в блоге Брэда Уилсона о шаблоны по умолчанию, используемые в ASP.NET MVC. Когда у вас есть свойство модели типа Enum, визуализируется строковый шаблон. Таким образом, вы можете настроить этот шаблон строкового редактора следующим образом:

~/Views/Shared/EditorTemplates/String.cshtml:

@model object
@if (Model is Enum)
{
    <div class="editor-label">
        @Html.LabelFor(m => m)
    </div>
    <div class="editor-field">     
        @Html.EnumDropDownListFor(m => m)
        @Html.ValidationMessageFor(m => m)
    </div>
}
else
{
    @Html.TextBox(
        "",
        ViewData.TemplateInfo.FormattedModelValue,
        new { @class = "text-box single-line" }
    )
}

а затем, на ваш взгляд, просто:

@Html.EditorFor(x => x.SomeEnumProperty)
person Darin Dimitrov    schedule 16.04.2011
comment
Отлично! Прочитал этот пост, но не понял, что эта строка будет использоваться по умолчанию. Этот шаблон используется, если он не может соответствовать чему-либо другому? - person ajbeaven; 16.04.2011
comment
Не могу заставить его работать, так как @if (Model is Enum) всегда возвращает false, поскольку модель всегда равна нулю! .. чего мне не хватает!! ... большое спасибо. - person Hossam; 31.05.2011
comment
@if(ViewData.ModelMetadata.ModelType.IsEnum) следует использовать вместо проверки экземпляра, чтобы значения NULL были подобраны правильно. - person Ivan Zlatev; 03.12.2012
comment
Я хотел сказать ViewData.ModelMetadata.ModelType, потому что, если он допускает значение NULL, IsEnum вернет false, поэтому вам нужно проверить базовый тип. - person Ivan Zlatev; 03.12.2012