Я уверен, что на этот вопрос уже был дан ответ, но последние три часа я потратил на поиск приемлемого решения и не смог ничего найти, поэтому прошу прощения за то, что, я уверен, повторю.
У меня есть два объекта домена, Player и Position. У игрока есть позиция. Мои доменные объекты - это POCO, связанные с моей базой данных с помощью NHibernate. У меня есть действие Add, которое принимает Player, поэтому я использую встроенную привязку модели. На мой взгляд, у меня есть выпадающий список, который позволяет пользователю выбрать позицию для игрока. Значение раскрывающегося списка - это идентификатор позиции. Все заполняется правильно, за исключением того, что мой объект Position не проходит проверку (ModelState.IsValid), поскольку в точке привязки модели он имеет только Id и ни один из других обязательных атрибутов.
Какое решение для решения этой проблемы с ASP.NET MVC 2 является предпочтительным?
Решения, которые я пробовал ...
- Извлечение позиции из базы данных на основе идентификатора перед вызовом ModelState.IsValid в действии Add моего контроллера. Я не могу заставить модель снова выполнить проверку, поэтому ModelState.IsValid всегда возвращает false.
- Создайте пользовательский ModelBinder, который наследует от связывателя по умолчанию, и извлеките Position из базы данных после вызова базового связывателя. Кажется, что ModelBinder выполняет валидацию, поэтому, если я использую что-либо из связующего по умолчанию, я попадаю. Это означает, что я должен полностью свернуть свое собственное связующее и извлечь каждое значение из формы ... это кажется действительно неправильным и неэффективным для такого распространенного варианта использования.
Решения, которые, как мне кажется, могут работать, я просто не могу понять, как это сделать ...
- Отключить проверку для класса Position при использовании в Player.
- Запись пользовательского ModelBinder использует связыватель по умолчанию для большей части привязки свойств, но позволяет мне получить Положение из базы данных ДО того, как связыватель по умолчанию запустит проверку.
Итак, как остальные решают эту проблему?
Спасибо
Dan
P.S. По моему мнению, наличие PositionId на Player только для этого случая не является хорошим решением. Это должно быть решаемо более элегантно.