Проверка формы MVC не удалась из-за двух обязательных полей с неиспользованным
Я использую MVC ViewModel. В форме есть две кнопки-переключателя с да или нет. Если пользователь выбирает "Да", TextField1 будет отображаться, а если выбрать "Нет", TextField2 будет отображаться. Оба обязательных поля с символом * (звездочка). Даже в обоих обязательных полях пользователю разрешено заполнять только одно TextField за раз на основе выбора радиокнопки. Проблема заключается в том, что когда пользователь отправляет одно из текстовых полей, требуется сообщение об ошибке проверки. Есть ли способ обойти эту проблему?
1 ответ
Вы не можете иметь оба, если вы только отображаете один.
Один из самых простых способов обойти это - одно из преимуществ использования моделей представления по сравнению с передачей объекта DTO на страницу.
Мне нужно будет сделать здесь много предположений, потому что вы не предоставили никакого кода, но ваш вопрос достаточно прост. Даже если мои предположения неверны, принципы могут быть легко экстраполированы на ваш конкретный вариант использования.
Я собираюсь предположить, что ваш объект выглядит примерно так:
public class DtoObject
{
public bool IsPositiveSelection { get; set; }
public string YesReason { get; set; }
public string NoReason { get; set; }
}
Не зная, что происходит, я предполагаю, что у вас есть на то веские причины. Возможно, просят адрес электронной почты в одном, а номер телефона другой.
Если вы еще этого не сделали, вам нужно создать модель вида, подобную этой:
public class DtoObjectViewModel
{
public bool YesNoRadio { get; set; }
[Required]
public string Reason { get; set; }
}
То, что я сделал здесь, вместо того, чтобы создавать два отдельных поля, иметь одно, которое всегда будет отображаться. Если вам нужно что-то вроде проверки электронной почты на одном, а номер телефона на другом, вы можете применить это с помощью JavaScript, а не просто полагаться на атрибуты.
Это позволит вам убедиться, что значение всегда там, независимо от того, в каком состоянии находится переключатель.
В какой-то момент вам нужно сопоставить вашу модель представления с вашим объектом DTO:
private DtoObject MapToDto(DoObjectViewModel model)
{
return new DtoObject
{
IsPositiveSelection = model.YesNoRadio,
YesReason = model.YesNoRadio ? model.Reason : "",
NoReason = model.YesNoRadio ? "" : model.Reason
};
}
Есть также много других вариантов, но для этого потребуется больше JavaScript, и любой ответ станет еще шире, чем этот.