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