2016-09-06 9 views
0

Я использую MVC ViewModel. Есть два переключателя с да или нет в форме. Если пользователь выбирает «Да», TextField1 будет отображаться, и если будет выбран «No» TextField2. Оба являются обязательными полями с символом * (asterick). Даже оба требуемых поля пользователю разрешено заполнять только один TextField за раз, исходя из выбора радиообмена. Проблема заключается в том, когда пользователь отправляет одно из текстового поля, которое отображает требуемое сообщение об ошибке проверки. Есть ли способ обхода проблемы.Ошибка проверки формы MVC из-за двух обязательных полей с неиспользованным

+0

Значит, два поля, объявленные как 'Обязательный', в вашей модели как DataAnnotation? –

+0

Да. Оба поля являются обязательными. – VVR147493

+0

так вы против использования javascript? Если нет, почему бы не удалить аннотации данных «Обязательные» из вашей модели, а затем проверить JS, чтобы проверить, проверен ли один или другие переключатели, если да, то '.attr (« required »)'? –

ответ

1

У вас не может быть как требуется, если вы только показываете.

Одним из самых простых способов обойти это является одно из преимуществ использования View Models над передачей объекта 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 вместо того, чтобы просто полагаться на атрибуты.

Это то позволит Вам убедиться, что значение всегда, независимо от того, в каком состоянии кнопку радио в.

В какой-то момент, вы должны сопоставить View Model обратно в DTO объект :

private DtoObject MapToDto(DoObjectViewModel model) 
{ 
    return new DtoObject 
    { 
     IsPositiveSelection = model.YesNoRadio, 
     YesReason = model.YesNoRadio ? model.Reason : "", 
     NoReason = model.YesNoRadio ? "" : model.Reason 
    }; 
} 

есть много других вариантов, а также, но те, потребует более JavaScript, и сделать любой ответ еще шире, чем это один уже есть.

+0

Спасибо за быстрое обновление. Кажется, это лучший ответ вместо использования javascript. Но когда пользователь отправляет, я хочу показать сообщение об ошибке проверки для соответствующих полей. Если я использую только одно поле, я не могу показать конкретное сообщение об ошибке для не выбранного. – VVR147493

+0

Ну с помощью этого метода вы не будете показывать/скрывать один из ящиков. Вам все еще понадобится JavaScript, но это, вероятно, будет наименьшим количеством работы. – krillgar

+0

Или вы всегда можете запустить проверки вторичного типа на сервере и добавить ошибку в ModelState и вернуть ее на страницу. – krillgar