MVC 5.1 Razor Display для не работающего с Enum DisplayName

c# razor enums asp.net-mvc-5.1

22192 просмотра

1 ответ

У меня есть следующий объект и модель объекта (домена), которые содержат перечисление. Отображаемое имя отображается правильно и работает для 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; }
}

ПОСМОТРЕТЬ

<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>
Автор: devfunkd Источник Размещён: 12.11.2019 09:26

Ответы (1)


73 плюса

Решение

Создать новую папку Views / Shared / DisplayTemplates.
Добавить пустое частичное представление с именем Enum в папку.
Заменить код Enum View следующим:

@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)
}

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

Автор: Vitaliy Kotov Размещён: 25.06.2014 10:24
Вопросы из категории :
32x32