ASP.NET MVC: Отображаем Enum на формуе или еще раз о локализации
Сайтостроение | создано: 11.01.2013 | опубликовано: 11.01.2013 | обновлено: 13.01.2024 | просмотров: 8043
Новое дополнение в утилитах для 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. В таблице я увижу следующее:

Колонка “статус” выглядит неподобающим образом. Для того чтобы это исправить, надо проделать следующие несложные операции.
Решение задачи отображения 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 строка. Запустим приложение и посмотрим результат:

Колонка “статус” приобрела для пользователей более удобочитаемый вид.
И последнее, что хотелось бы добавить, это то, что на данный момент, локализация из ресурсных файлов не поддерживается, как это реализовано для EnumDropDownList.
Установнка nuget-пакета
Для установки MvcTools-пакета используйте пожалуйста следующий код, который можно выполнить в Pachage Manager Console:
PM> Install-Package MvcTools
Удачного кодирования и, да прибудет с вами сила.