MVC и XVal с раскрывающимися списками - значение "Пожалуйста, выберите" недействительно.

Я следую подходу, описанному здесь для этого.

У меня проблема с проверкой раскрывающегося списка с помощью xval, привязка MVC, кажется, делает неправильный вывод, позволяя операции пройти проверку, но состояние модели сохраняет исключение привязки и делает страницу недействительной, поэтому я получаю ситуацию, когда операция разрешено выполнение с недопустимыми данными, но страница недействительна, поэтому пользователь может предположить, что проверка не удалась.

Это может прояснить

Это мой раскрывающийся список, предположим, что пользователь ничего не сделал, поэтому выбрано «Пожалуйста, выберите».

  Do you like cheese:
     <select name="Favourites.Cheese">
         <option>Please Select</option>
        <option value="1">Yes</option>
        <option value="0">No</option>
     </select>
     <%=Html.ValidationMessage("Favourites.Cheese")%>

Это действие контроллера из сообщений, MVC сопоставляет значение false с fav.cheese,

public ActionResult Create(Favourites fav)
{
            try
            {
                _favTask.Create(fav);
            }
            catch (RulesException ex)
            {
                ex.AddModelStateErrors(ModelState, "Favourites");
            }

            if(!ModelState.IsValid)
            {
                //redirect back
            }
            //other stuff
 }

Имущество было отнесено

 pulic class Favourites
    {
         [Required]
          public bool Cheese{get;set;}
    }

Никаких исключений не генерируется, потому что fav.cheese имеет значение

public int Create(Favourites fav)
{

   var errors = DataAnnotationsValidationRunner.GetErrors(fav);
   if (errors.Any())
       throw new RulesException(errors);

       //create fav   
 }

Но когда фокус возвращается к контроллеру, ModelState.Isvalid принимает значение false, поэтому from перезагружается с сообщением Значение «Пожалуйста, выберите» недействительно. Как мне это предотвратить, и как это сделать Я использую xVal метод проверки «Пожалуйста, выберите значение»?


person Dan    schedule 28.04.2009    source источник


Ответы (2)


Boolean - это тип значения, поэтому он всегда будет иметь значение. [Обязательно] поэтому не имеет никакого реального эффекта. Что произойдет, если вместо этого вы воспользуетесь Nullable ‹bool›? Это должно позволить MVC присвоить нулевое значение, если выбран первый вариант, а атрибут Required может затем утверждать, что пользователь действительно выбрал значение.

person GalacticCowboy    schedule 29.04.2009

Если вы хотите, чтобы пользователь мог не выбирать значение и выводить false, я бы дал вашему выбору по умолчанию значение 0. Таким образом, будет отправлено значение, даже если они его не выберут, и атрибут Required будет быть довольным.

<option value="0">Please Select</option>

РЕДАКТИРОВАТЬ: на основе ваших комментариев я предлагаю выполнить некоторую проверку на стороне клиента с помощью подключаемого модуля проверки на стороне клиента, например jQuery проверка. Это позволит вам в большинстве случаев выдать подходящее сообщение об ошибке, не отправляя запрос. На стороне сервера, если ModelState недействителен и это конкретное поле недействительно, замените сообщение об ошибке более подходящим. Я бы не предлагал изменять модель только для того, чтобы приспособить структуру привязки.

person tvanfosson    schedule 28.04.2009
comment
Mvc сопоставит это с ложным нет? при этом окажется, что что-то было выделено? - person Dan; 29.04.2009
comment
Я неправильно понял ваш вопрос? Вы сказали, что теперь они получают ошибку проверки. Значение «Пожалуйста, выберите» недействительно, и вы хотели остановить ошибку? Что вы хотите вместо этого? - person tvanfosson; 29.04.2009
comment
Я хочу отобразить сообщение типа «Пожалуйста, выберите значение»: текущее сообщение является побочным продуктом привязки MVC, а не проверки xval, нет? - person Dan; 30.04.2009
comment
Повторите свое правление, которое не кажется правильным - фреймворк проверки, который не может раскрывать выпадающие списки Генделя - и поэтому я должен полагаться на клиентскую сторону - ручную замену - я надеюсь, что есть лучший способ. - person Dan; 01.05.2009
comment
@Dan - Проблема в том, что значение в модели имеет правильное значение, потому что логическое значение должно принимать какое-то значение. Вы можете сделать поле логическим значением, допускающим значение NULL, но это, похоже, нарушает модель, чтобы соответствовать структуре проверки. Вы можете явно проверить, предоставлено ли поле, и установить состояние модели вручную, но почему бы просто не обновить сообщение? - person tvanfosson; 01.05.2009