ASP.Net MVC RC2 ValidationMessage и конфликт полей формы? - PullRequest
2 голосов
/ 11 марта 2009

У меня проблемы с MVC RC2, когда при сбое валидации поле с ошибкой выдает исключение NullReferenceException при возврате представления пользователю.

Было найдено краткосрочное решение: переименовать сообщение Html.ValidationMessage, чтобы оно отличалось от поля формы назначения. Это работает!

НО теперь автоматическое выделение отключено от поля ввода. (Поведение «из коробки» - это изменение класса CSS целевого поля, что делает его выдающимся)

Итак ...

В чем проблема с моим кодом? А ТАКЖЕ Почему это не позволяет моим полям ValidationMessage и Form иметь одинаковые имена?

Код генерирует исключение NullReferenceException при выполнении следующего кода:

Просмотр кода

<% using (Html.BeginForm()) { %>
   <fieldset>
     <h5>Terms and Conditions</h5>
     <p>
       <%= Html.CheckBox("Terms", false)%>
       <%= Html.ValidationMessage("Terms")%>
       I agree to the <a href="/signup/terms">Terms & Conditions.</a>
     </p>
   </fieldset>
   <input class="signup_button" type="submit" title="Sign Up" value="" />
<% } %>
<%= Html.ValidationSummary("Sign up wasn't successful.")%>

Код контроллера

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index()
{
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection form)
{
    bool Terms = form["Terms"].ToString() == "true,false" ? true : false;

    if (Terms)
    {
        return RedirectToAction("Success", "Signup");
    }
    else 
    {
        ModelState.AddModelError("Terms", "Please agree to the Terms");
        ModelState.AddModelError("_FORM", "Terms not checked");
    }
    return View();
}

Я могу заставить код работать, если я опущу следующее:

ModelState.AddModelError("Terms", "Please agree to the Terms");

Но при этом флажок выдает исключительную ссылку Null.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 11 марта 2009

Попробуйте это:

else 
{
    ModelState.AddModelError("Terms", "Please agree to the Terms");
    ModelState.SetModelValue("Terms", form.ToValueProvider()["Terms"]);
    ModelState.AddModelError("_FORM", "Terms not checked");
}

Если это не сработает, пожалуйста, отправьте полный стек для исключения.

0 голосов
/ 11 марта 2009

В таком случае, почему вы передаете коллекцию форм? Почему бы не сделать это?

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(bool terms)
{
    if (terms)
    {
        return RedirectToAction("Success", "Signup");
    }
    else 
    {
        ModelState.AddModelError("Terms", "Please agree to the Terms");
        ModelState.AddModelError("_FORM", "Terms not checked");
    }
    return View();
}

Это должно работать просто отлично.

0 голосов
/ 11 марта 2009

Похоже, краткосрочный ответ - просто переименовать html.ValidationMessage во что-то другое

<%= Html.ValidationMessage("TermsError")%>

И убедитесь, что элемент управления использует то же имя при добавлении состояния ошибки

ModelState.AddModelError("TermsError", "Please agree to the Terms");

Это исправляет проблему для меня. Тем не менее, я задаюсь вопросом ... каково лучшее соглашение об именовании для использования html.ValidationMessage?

...