Подтвердить что ты не робот

MVC 5.1 Razor DisplayFor не работает с Enum DisplayName

У меня есть следующий объект и модель объекта (домена), которые содержат перечисление. Отображаемое имя отображается правильно и работает для EnumDropdownList, но по какой-то причине не для помощника DisplayFor, все, что отображается, является фактическим именем перечисления.

Не уверен, что мне не хватает, asp.net MVC 5.1 добавила поддержку отображаемого имени для этого, поэтому мне не нужно создавать собственные вспомогательные методы. См.: https://aspnet.codeplex.com/SourceControl/latest#Samples/MVC/EnumSample/EnumSample/Models/Enums.cs

public class Addon
{
    public int Id { get; set; }
    public AddonType AddonType { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public bool IsActive { get; set; }
}

public enum AddonType : byte
{
    [Display(Name = "Cake Theme")]
    CakeTheme,
    [Display(Name = "Cake Flavour")]
    CakeFlavour,
    [Display(Name = "Cupcake Icing")]
    CupcakeIcing,
    [Display(Name = "Party Addon")]
    AddOn
}

МОДЕЛЬ

public class AddonModel
{
    public int Id { get; set; }
    public AddonType AddonType { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int Quantity { get; set; }
    public bool IsActive { get; set; }
}

VIEW

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>Type</th>
        <th>Name</th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(model => item.AddonType)
        </td>
        <td>
            @Html.DisplayFor(model => item.Name)
        </td>
        <td>
            @Html.DisplayFor(model => item.Price)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
            @Html.ActionLink("Details", "Details", new { id=item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Id })
        </td>
    </tr>
}

</table>
4b9b3361

Ответ 1

Создать новую папку Views/Shared/DisplayTemplates
Добавить пустой Partial View с именем Enum, в папку
Заменить Enum Просмотреть код с помощью

@model Enum

@if (EnumHelper.IsValidForEnumHelper(ViewData.ModelMetadata))
{
// Display Enum using same names (from [Display] attributes) as in editors
string displayName = null;
foreach (SelectListItem item in EnumHelper.GetSelectList(ViewData.ModelMetadata, (Enum)Model))
{
    if (item.Selected)
    {
        displayName = item.Text ?? item.Value;
    }
}

// Handle the unexpected case that nothing is selected
if (String.IsNullOrEmpty(displayName))
{
    if (Model == null)
    {
        displayName = String.Empty;
    }
    else
    {
        displayName = Model.ToString();
    }
}

@Html.DisplayTextFor(model => displayName)
}
else
{
// This Enum type is not supported.  Fall back to the text.
@Html.DisplayTextFor(model => model)
}

Вот ссылка на подробную статью Шахриар Хоссейн