JohnCoffey
@JohnCoffey
Учусь.

Как лучше обработать такую привязку модели?

Изучаю MVC, возник небольшой вопрос
Допустим есть модель, в котором есть Required поле...

public class AddressModel {
[Required]
[AddressRemoteDropDownList(1, "id", null)]
[Display(Name = "Регион", Order = 1)]
public string RegionId { get; set; }

[AddressHidden(1, "code")]
[Display(Order = 2)]
public string RegionCode { get; set; }
}

Есть модель формы c ссылкой на класс адреса (на клиенте блок с адресом является всплывающим окном ) -
public class FormModel {
...
public AddressModel Address
...
}

блок с адресом является необязательным, юзер может не открыть всплывающее окно и ничего не заполнить...

Получается при отправке формы на сервер, input value свойств AddressModel = "" и в контроллер попадает объект у которого все свойства класса AddressModel = null

И ModelState ругается, что RegionId не заполнено...

Как быть в такой ситуации лучше, по хорошему само свойство Address формы должно быть null чтоб валидация серверная не ругалась?

Или нужен кастомный ModelBinder, или еще как проще решается (без снятия атрибута Required с RegionId )

Сорри за глупый вопрос, спасибо...
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ответы на вопрос 2
У нас был похожий случай, нагуглил способ Required с условием, делается через кастомный атрибут. В нем по любым другим свойствам модели определяется должно ли поле быть обязательным, или нет.

Если в вашем случае всегда есть условие что модель имеет null в требуемом свойстве и это никак не отличить от другого требования, где оно не должно быть null, то такую ситуацию даже ИИ сложно будет решить, шутка, такая задача не решаема. В другом случае подойдет Required с условием.

1) Гуглим - Conditional Required Attribute
2) Используем FluentValidation https://github.com/JeremySkinner/FluentValidation (это очень мощный инструмент). Позволяет пилить свою валидацию удобно и с извращениями/любым количеством условий.
Ответ написан
Комментировать
Валидируйте модель самостоятельно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы