2009-03-11 11 views
2

J'ai des problèmes avec MVC RC2 où, lors de l'échec de la validation, le champ échoué lève une exception NullReferenceException lorsque la vue est renvoyée à l'utilisateur.ASP.Net MVC RC2 ValidationMessage et conflit de champ de formulaire?

Une solution à court terme a été trouvée: qui consistait à renommer le Html.ValidationMessage pour être différent du champ de formulaire cible. Cela marche! MAIS maintenant la surbrillance automatique est déconnectée du champ de saisie. (Hors de la boîte behavour est de changer la classe CSS champ cible qui le rend hors concours)

Alors ...

Quel est le problème réel avec mon code? ET Pourquoi ne permet-il pas mes champs ValidationMessage et Form partagent les mêmes noms?

Le code est de lancer NullReferenceException lorsque le code suivant est exécuté:

Afficher le code

<% 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.")%> 

code contrôleur

[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(); 
} 

Je peux obtenir le code de travail si j'omets ce qui suit:

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

Mais avec ceci, la case à cocher lève l'exception de référence nulle.

Des idées?

+0

Le Html.ValidationMessage doit-il avoir un nom différent du contrôle auquel il est associé? –

+0

J'ai utilisé le contrôleur de compte et le code de vue comme référence. Ici, ils ont nommé l'objet ValidationMessage le même que le champ associé.Je pense que cela pourrait être un bug avec la case à cocher –

+0

Je pense que cela soulève la question plus importante de savoir pourquoi le code exemple MVC a le contrôleur en charge de la validation. Si le modèle exige que les termes == Vrai, cela devrait être dans le modèle. –

Répondre

3

Essayez ceci:

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

Si cela ne fonctionne pas, alors s'il vous plaît poster la pile complète de l'exception.

+0

Cela a fonctionné! Maintenant, pouvez-vous expliquer pourquoi? –

+0

L'API a été modifiée dans RC 1 pour prendre en charge plusieurs messages/erreurs par nom. –

0

On dirait une réponse à court terme est simplement de renommer le Html.ValidationMessage à quelque chose d'autre

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

Et assurez-vous que le contrôle utilise le même nom lors de l'ajout d'un état d'erreur

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

Cela résout le problème pour moi. Pourtant, je me demande encore ... quelle est la meilleure convention de nommage pour utiliser le html.ValidationMessage?

+0

Cette réponse introduit un problème ennuyeux où les zones de texte ne sont plus changeant de couleur pour mettre en évidence le problème de validation –

0

Dans ce cas, pourquoi passez-vous la collection de formulaires? Pourquoi ne pas faire ça?

[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(); 
} 

Cela devrait fonctionner correctement.

+0

Hey Phil, je ne suis pas sûr que vous avez lu la question. Cet exemple est simplifié car il y a environ 12 champs de formulaire –