ASP.NET MVC: Отображаем Enum на формуе или еще раз о локализации

ru-RU | создано: 11.01.2013 | опубликовано: 11.01.2013 | обновлено: 01.01.2018 | просмотров за всё время: 6020

Новое дополнение в утилитах для ASP.NET MVC. Если вы как и я не сторонник именовать Enum на русском языке, то наверняка сталкивались с такой задачей, как отображение английского значения Enum в более понятной форме, то есть на русском языке.

Из прошлых статей

В одной из прошлых статей я уже писал о том, как можно локализовать Enum при редактировании формы. Как вы помните в MvcTools существует для этого Html.DropDownListFor(). Недавно мне потребовалось просто отобразить на форме значение Enum. Как оказалось, не всё так просто.

Enum. Как оно есть

В библиотеку MvcTools сегодня было добавлено очередное полезное расширение HtmlHelper, которое можно использовать для отображения Enum.

Давайте предположим, что у меня есть некоторое перечисление (Enum):

public enum OrderStatus {
   Measurement,
   Calculation,
   Signing,
   Expectation,
   Production,
   Installation,
   Completed
}

Если я попытаюсь отобразить модель (в моем случае OrderViewModel), в которой содержится свойство типа OrderStatus:

@if (Model != null && Model.Any()) {
<table>
    <tr>
        <th>Номер (ID)th>
        <th>Датаth>
        <th>Статусth>
        <th>Менеджерth>
        <th>Заказчикth>
        <th>Примечаниеth>
    tr>
    @foreach (var item in Model) {
        <tr>
            <td>@item.Name (@item.Id)td>
            <td>@Html.DisplayFor(x => item.CreatedAt)td>
            <td>@Html.DisplayFor(x => item.Status)td>
            <td>@Html.DisplayFor(x => item.ManagerFullName)td>
            <td>@Html.DisplayFor(x => item.CustomerFullName)td>
            <td>@Html.DisplayFor(x => item.Description)td>
        tr>
    }
table>
@Html.PagerForPagedList(Model.PageIndex, Model, "index", "orders")
}

Обратите внимание на 15 строку. Status у меня имеет тип OrderStatus, то есть enum. В таблице я увижу следующее:

104-000001

Колонка “статус” выглядит неподобающим образом. Для того чтобы это исправить, надо проделать следующие несложные операции.

Решение задачи отображения Enum

Для начала добавим немного атрибутов:

public enum OrderStatus {

    [Display(Name = "Замер")]
    Measurement,
        
    [Display(Name = "Расчет")]
    Calculation,
        
    [Display(Name = "Заключение договора")]
    Signing,
        
    [Display(Name = "Ожидание материала")]
    Expectation,
       
    [Display(Name = "Производство")]
    Production,
        
    [Display(Name = "Готов к установке")]
    Installation,
        
    [Display(Name = "Завершен")]
    Completed
}

В разметке поменяем HtmlHelper на новый EnumDisplayFor из MvcTools:

@if (Model != null && Model.Any()) {
<table>
    <tr>
        <th>Номер (ID)th>
        <th>Датаth>
        <th>Статусth>
        <th>Менеджерth>
        <th>Заказчикth>
        <th>Примечаниеth>
    tr>
    @foreach (var item in Model) {
        <tr>
            <td>@item.Name (@item.Id)td>
            <td>@Html.DisplayFor(x => item.CreatedAt)td>
            <td>@Html.EnumDisplayFor(x => item.Status)td>
            <td>@Html.DisplayFor(x => item.ManagerFullName)td>
            <td>@Html.DisplayFor(x => item.CustomerFullName)td>
            <td>@Html.DisplayFor(x => item.Description)td>
        tr>
    }
table>
@Html.PagerForPagedList(Model.PageIndex, Model, "index", "orders")
}

Ваше внимание заслуживает только 15 строка. Запустим приложение и посмотрим результат:

104-000002

Колонка “статус” приобрела для пользователей более удобочитаемый вид.

И последнее, что хотелось бы добавить, это то, что на данный момент, локализация из ресурсных файлов не поддерживается, как это реализовано для EnumDropDownList.

Установнка nuget-пакета

Для установки MvcTools-пакета используйте пожалуйста следующий код, который можно выполнить в Pachage Manager Console:

PM> Install-Package MvcTools

Удачного кодирования и, да прибудет с вами сила.