Условная обязательная аннотация данных с помощью EditorForModel

У нас есть ViewModel для «создания» и одна для «редактирования». Редактирование наследуется от создания, поэтому мы используем общие поля. Затем мы используем @Html.EditorForModel("User"), который использует "create" в качестве своей модели.

Это для редактирования пользователей, поэтому мне нужно, чтобы поле пароля требовалось при создании, но не требовалось при удалении. Таким образом, виртуальная машина создания имеет пароль с атрибутом [Required], а виртуальная машина редактирования имеет свойство пароля без оформления и также объявлена ​​с новым (публичная новая строка Password {get;set;}).

Это почти точно похоже на этот вопрос: Условно-обязательная аннотация MVC4

В моей ситуации по-прежнему требуется поле, которое, как я полагаю, связано с тем, что EditorTemplate использует объект создания в качестве своей модели вместо редактирования. Я попытался изменить его с editorformodel на:

@Html.EditorFor(model=>model, "User")

в надежде, что, поскольку редактирование на самом деле является «созданием» из-за наследования, оно сработает, но оно все еще лает на меня за то, что я не указал обязательное поле при публикации.

Есть ли способ выполнить то, что я пытаюсь, или есть ли у меня варианты либо удалить требуемое и обработать его на стороне сервера, либо разделить шаблон редактора на два шаблона?


person tjans    schedule 16.10.2014    source источник


Ответы (1)


Вы можете создать собственный атрибут, чтобы проверить, требуется ли пароль или нет. Когда отправка происходит на сервер, ваш настраиваемый атрибут может проверить, имеете ли вы дело с обновлением или вставкой, а затем аннулировать модель, если это необходимо.

Вот несколько ресурсов по созданию пользовательских атрибутов и пользовательские атрибуты с ненавязчивой проверкой jquery

Удачного кодирования!!

person Gjohn    schedule 16.10.2014
comment
Это, вероятно, путь ... просто нужно выяснить, как определить, является ли это редактированием или созданием внутри этого атрибута. - person tjans; 16.10.2014
comment
@tjans, поскольку вы наследуете класс создания, вы можете создать свойство в своем классе создания и задать конструктору значение для этого свойства. Таким образом, когда обновление наследуется от создания, оно может установить для этого конкретного свойства значение «Редактировать». В противном случае значение свойства остается как Create. Затем ваш настраиваемый обязательный атрибут для поля пароля может проверить это, чтобы определить, требуется ли пароль или нет. - person Gjohn; 16.10.2014
comment
Именно так я начал кодировать его, а затем, после того как я передал свою идею одному из моих коллег, мы остановились на атрибуте RequiredIfRouteName, и мы будем требовать его только для данного маршрута, хотя получение имени маршрута может и не получиться. быть возможным внутри атрибута. - person tjans; 16.10.2014