У меня есть такая модель:
public class Person
{
public int ID { get; set; }
[Required(ErrorMessage="Name cant be empty")]
public string Name { get; set; }
public Person Friend { get; set; }
}
Я хочу создать нового персонажа и создать форму с полями, используя строго типизированный HtmlHelper
- ID
- Имя
- Идентификатор друга (раскрывающийся список с такими параметрами, как
<option value="Friend.ID">Friend.Name</option>
При отправке формы мой контроллер принимаетОбъект Person (p
), который связан с использованием связывателя модели по умолчанию. Просто чтобы быть в явном виде, связыватель модели выполняет следующие действия: Свойства ID
и Name
связаны должным образом. Для Friend
установлено новое значениеPerson
экземпляр, чей ID
равен идентификатору человека, которого я выбрал в раскрывающемся списке. Значение Friend.Name
равно null
, поскольку я не указал его значение в форме.
Проблема: Я хочу, чтобы RequiredAttribute
срабатывал в текстовом поле Name
, если оно пустое - и это так. Проблема в том, что он также запускается в атрибуте имени Friend
.Поэтому, когда я отправляю сообщения, заполняя все поля, я получаю, что ModelState недействителен и ошибка в том, что p.Friend.Name
iтребуется.
Как бы я решил эту проблему?Конечно, в этом случае я не хочу проверять свойства Friend
. Я думал о:
- Использование ViewModels для моих представлений, что каким-то образомрешить мои проблемы.Я еще не пробовал этого, так как чувствую, что мне действительно не нужно для такой простой задачи
- Отправка идентификатора друга в качестве отдельного параметра
friend_id
и привязка свойства Friend
вручную.Только атрибуты ID
и Name
публикуемого лица привязаны, и я вручную установил свойство Friend
.Это включает получение Friend
из моего репозитория с использованием friend_id
, чтобы сделать его «реальным» объектом Person. - Проверка ModelState и удаление ошибок, которые я знаю, не учитываются.Это просто неправильно и не масштабируемо (не забудьте сделать это, если я добавлю, например,
SecondFriend
свойство
. Мне кажется, вариант 2 - самый выполнимый, но в идеале я быэто не может быть автоматическим. Кроме того, я не могу использовать строго типизированный помощник, поскольку атрибут friend_id
textbox 'name
должен соответствовать имени параметра метода действия.
Я чувствую, что есть какой-то момент, который я'мы упустили, что бы это упростило. Надеюсь, я прав. Хотя я думаю, что использование ViewModel немного утомительно, но это правильная вещь, пожалуйста, скажите.
Edit
На данный момент решена проблема с использованием ViewModels с ID
, Name
и Friend_id
в качестве его свойств и теми же атрибутами проверки, что и у модели Person
. Затем я сопоставляю ID
и Name
значения для нового экземпляра Person
. Затем свойство Friend устанавливается путем загрузки указанного друга из хранилища. Например, newPerson.Friend = repository.Get(viewModel.Friend_id)
Когда я получаю время, планирую присмотреться к AutoMapper сделатьэто "автоматически".