ASP.NET MVC: Using EditorFor() with a default template for enums
Asked Answered
F

1

18

I've written an EnumDropDownFor() helper which I want to use in conjunction with EditorFor(). I've only just started using EditorFor() so am a little bit confused about how the template is chosen.

My Enum.cshtml editor template is below:

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

Short of explicitly defining the template to use, is there any way to have a default template which is used whenever an Enum is passed in to an EditorFor()?

Fezzan answered 16/4, 2011 at 1:5 Comment(0)
R
25

You may checkout Brad Wilson's blog post about the default templates used in ASP.NET MVC. When you have a model property of type Enum it is the string template that is being rendered. So you could customize this string editor template like this:

~/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" }
    )
}

and then in your view simply:

@Html.EditorFor(x => x.SomeEnumProperty)
Roland answered 16/4, 2011 at 8:30 Comment(4)
Excellent! Had read that post but didn't realise that string would be used by default. Is this the template that is used if it can't match anything else?Fezzan
Cannt get it to work, as @if(Model is Enum) always return false as the Model is alwyes null!! .. what I'm missing!! ... thanks alot.Baltic
@if(ViewData.ModelMetadata.ModelType.IsEnum) should be used instead of checking the instance, so that nullabes are picked up correctly.Avian
Guh I meant to say ViewData.ModelMetadata.ModelType, because if it's nullable IsEnum will return false so you have to check the underlying type.Avian

© 2022 - 2024 — McMap. All rights reserved.