ASP.NET MVC 2 - HTML.EditorFor () и шаблоны пользовательских редакторов
-
22-07-2019 - |
Вопрос
С добавлением в MVC 2 функции HtmlHelper EditorFor () невозможно создать строго типизированные шаблоны отображения и редактора для данного объекта Model, и после того, как я с ним поигрался, я немного озадачен тем, как передавать дополнительные данные модели в редактор без потери строгой типизации элемента управления редактора.
Классический пример: товар имеет категорию. В ProductEditor есть DropDownList для категории, содержащей имена всех категорий. ProductEditor строго типизирован для Product, и нам нужно передать список выбора категорий, а также Product. Р>
В стандартном представлении мы обернем данные модели в новый тип и передадим их. С EditorTemplate мы теряем некоторые стандартные функции, если мы передаем смешанную модель, содержащую более одного объекта (первое, что я заметил, было то, что все методы LabelFor / TextBoxFor производили имена сущностей, такие как " Model.Object " вместо просто ") ; Объект & Quot;.) р>
Я делаю это неправильно или Html.EditorFor () должен иметь дополнительный параметр ViewDataDictionary / Model?
Решение
Вы можете создать пользовательскую ViewModel, которая имеет оба свойства, ИЛИ вам нужно будет использовать ViewData для передачи этой информации.
Другие советы
Я все еще учусь, но у меня была похожая проблема, для которой я разработал решение. Моя категория - это перечисление, и я использую шаблонный элемент управления, который проверяет перечисление, чтобы определить содержимое для тега Select.
Используется в представлении как:
<%= Html.DropDownList
(
"CategoryCode",
MvcApplication1.Utility.EditorTemplates.SelectListForEnum(typeof(WebSite.ViewData.Episode.Procedure.Category), selectedItem)
) %>
Перечисление для Category украшено атрибутами Description, которые будут использоваться в качестве текстовых значений в элементах Select:
public enum Category
{
[Description("Operative")]
Operative=1,
[Description("Non Operative")]
NonOperative=2,
[Description("Therapeutic")]
Therapeutic=3
}
private Category _CategoryCode;
public Category CategoryCode
{
get { return _CategoryCode; }
set { _CategoryCode = value; }
}
SelectListForEnum создает список элементов выбора с использованием определения перечисления и индекса для выбранного в настоящий момент элемента следующим образом:
public static SelectListItem[] SelectListForEnum(System.Type typeOfEnum, int selectedItem)
{
var enumValues = typeOfEnum.GetEnumValues();
var enumNames = typeOfEnum.GetEnumNames();
var count = enumNames.Length;
var enumDescriptions = new string[count];
int i = 0;
foreach (var item in enumValues)
{
var name = enumNames[i].Trim();
var fieldInfo = item.GetType().GetField(name);
var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
enumDescriptions[i] = (attributes.Length > 0) ? attributes[0].Description : name;
i++;
}
var list = new SelectListItem[count];
for (int index = 0; index < list.Length; index++)
{
list[index] = new SelectListItem { Value = enumNames[index], Text = enumDescriptions[index], Selected = (index == (selectedItem - 1)) };
}
return list;
}
Конечным результатом является красиво представленный DDL.
Надеюсь, это поможет. Будем весьма благодарны за любые комментарии о лучших способах сделать это.
Попробуйте использовать ViewData.ModelMetadata, в котором содержатся все аннотации вашего класса.
Отличная статья. noreferrer "> http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html