2010-01-19 5 views
0

Je rencontre des problèmes pour faire fonctionner le MVC modelstate avec un processus de connexion sur un site Web. J'ai un écran de connexion typique avec des champs pour un nom d'utilisateur et un mot de passe. Le contrôleur de compte dispose de deux méthodes pour gérer les connexions. La première est une méthode Get appelée "LogOn()" qui retourne juste la vue de connexion (qui est le nom d'utilisateur/pw), et la seconde est également appelée "LogOn (valeurs FormCollection)", mais elle a [AcceptVerbs (HttpVerbs.Post)] spécifié.ASP.NET MVC ModelState avec des méthodes GET/POST et des blocs try-catch

Ainsi, si un utilisateur tente de se connecter sans entrer de nom d'utilisateur et/ou de pw, la méthode post vérifie cela et ajoute des erreurs au ModelState via ModelState.AddModelEror(). C'est la première chose qui arrive, et après que cela a été validé, si ModelState.IsValidated() est false, alors je retourne juste View().

//(validate just adds to Modelstate when values are null) 
if (!ValidateLogOn(userName, password)) 
    return View(); 

Maintenant, cela fonctionne très bien, si l'sont vides alors la page, retourne et affiche le message d'erreur correcte à l'aide HtmlValidationMessage (keyName). Le problème est que, après que cela soit validé, je fais alors l'appel de connexion réel pour lancer le processus d'authentification pour le nom d'utilisateur/pw fourni, qui est enveloppé dans un bloc try/catch. Si une erreur se produit dans ce processus, je voudrais ajouter l'erreur à ModelState, et retourner le View(), comme je l'ai fait ci-dessus. L'erreur est ajoutée avec succès à ModelState, et la vue exécute correctement le code, mais après que cela se produit, la méthode Get Logon() est appelée, qui écrase tout et affiche simplement la vue comme si elle était la les utilisateurs visitent la page pour la première fois!

Ainsi, le processus de code global est similaire à celui affiché ci-dessous:

public ActionResult LogOn() 
{ 
    return View(); 
} 

public ActionResult LogOn(FormCollection values) 
{ 
    if (!ValidateLogOn(userName, password)) 
     return View(); 

    try { 
     loginProcess(username, password); 
    } 
    catch (Exception e) { 
     ModelState.AddModelError(keyName, "Error Message"); 
     return View(); 
    } 

    return View(); 
} 

Toute aide ou comprendre pourquoi ce processus fonctionne comme il ne serait grandement apprécié, merci !!

+1

Tout d'abord, pourquoi utilisez-vous try ... catch pour se connecter, pourquoi pas seulement loginProcess() retourne un bool? Deuxièmement, je ne suis pas sûr de comprendre exactement ce qui se passe, la vue est-elle rendue et envoyée correctement au client? Le client fait-il ensuite une redirection? Ou est-ce que la vue est en quelque sorte écrasée avant d'être envoyée au client? – roryf

+0

Hey Rory, merci pour la réponse rapide! La raison pour le bloc try/catch autour de loginProcess est de détecter différentes exceptions qui pourraient être lancées tout au long du processus, comme un nom d'utilisateur/pw incorrect, des exceptions de base de données, etc. Firebug me dit que le post se passe correctement. le client. Suite à cela, un GET to LogOn est demandé qui effectue l'écrasement. Cependant, le HTML en réponse du POST est tout là sauf mon message d'erreur. Dans le HTML j'ai <% = Html.ValidationMessage (keyName)%>. Merci encore pour l'aide! – Trevor

Répondre

0

Vous devez définir explicitement la valeur. Exemple pour nom d'utilisateur:

ModelState.SetModelValue(
    "username", 
    new ValueProviderResult(username, username, CultureInfo.InvariantCulture)); 
+0

Hey Darin, merci pour la réponse. J'ai essayé d'ajouter la ligne ci-dessus par elle-même, et je l'ai également essayé avec le AddModelError() en premier lieu. Parce que si vous essayez simplement SetModelValue(), ModelState.IsValid n'est pas défini sur false. Cependant, cela n'a pas corrigé le problème, et l'écrasement Get appel est toujours en cours. D'autres idées? – Trevor

Questions connexes