Я пытаюсь обойти тот факт, что, когда они написали asp.net MVC 3, они забыли включить код для добавления ненавязчивых атрибутов проверки для выбора списков, и их «исправление» для этого должно включать это в MVC 4, который никому не нужен для использования MVC 3.
Мой предложенный обходной путь - использовать Html.GetUnobtrusiveValidationAttributes()
, чтобы добавить их самостоятельно, как и любые другие пользовательские атрибуты, но я не могу определить правильный синтаксис для вызова метода. Есть 2 перегрузки, одна принимает строку, а другая - строку и класс ModelMetaData. Я понимаю параметр метаданных, я предполагаю, что просто передаю ViewData.ModelMetadata
, но какой должна быть строка? Документация MSDN говорит, что это «указанный атрибут имени HTML», который не имеет смысла для меня. Атрибут имени HTML чего? Список выбора? Зачем ему это нужно и как это поможет ему узнать, для какого свойства моей модели я хочу проверить? Глядя на примеры использования, они все, кажется, передают имя свойства в моей модели, для которого мне нужны атрибуты проверки, что имеет смысл. К сожалению, я не могу заставить метод возвращать что-либо, кроме пустой коллекции, независимо от того, что я передаю.
Мой класс модели называется Event, а мое свойство называется EventTypeID. Я использую немного другой класс viewmodel в качестве основы для представления, потому что мне нужно отобразить список событий, а также разрешить ввод нового события в том же представлении, поэтому у меня есть простой класс viewmodel, как показано ниже:
public class EventViewModel
{
public Model.Event NewEvent { get; set; }
public IEnumerable<Model.Event> Events { get; set; }
}
Раскрывающийся список сопоставляется со свойством, например: @Html.DropDownListFor(model => model.NewEvent.EventTypeID
что я передаю в виде строки Html.GetUnobtrusiveValidationAttributes(string)
или Html.GetUnobtrusiveValidationAttributes(string, ModelMetadata)
, чтобы получить атрибуты для этого свойства. Я пробовал:
Html.GetUnobtrusiveValidationAttributes("EventTypeID")
Html.GetUnobtrusiveValidationAttributes("EventTypeID",ViewData.ModelMetadata)
Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID")
Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID",ModelMetadata)
Все они возвращают пустую коллекцию.
Я знаю, что моя модель верна, потому что, если я изменю вызов с Html.DropDownListFor
на Html.TextBoxFor
, тогда проверка «просто работает», и мне не нужно делать ничего, кроме добавления атрибутов проверки в мой класс модели.
РЕДАКТИРОВАТЬ:
Только что попытался отключить проверку на стороне клиента, проверка отлично работает на стороне сервера для всех списков выбора.