ASP.NET MVC: return Redirect et ViewData
J'ai une boîte de connexion dans ma MasterPage. Chaque fois que les informations de connexion n'est pas correct, j'ai valoriser ViewData["loginError"]
pour afficher le message d'erreur à l'utilisateur.
De connexion est une action de l'UserController, de sorte que la forme qui contient le login a action = "/User/Login"
.
Comme un utilisateur peut essayer de se connecter à partir de n'importe quelle page, en cas de succès, j'ai rediriger lui de sa page personnelle, mais en cas d'erreur, je veux qu'il reste sur la même page, où il a tenté de se connecter. J'ai trouvé que cela fonctionne:
return Redirect(Request.UrlReferrer.ToString());
mais il semble que, comme je ne suis pas de retour une bonne vue, les données sur ViewData est perdu, donc je ne peux pas afficher le message d'erreur.
Toute suggestion sur la façon de résoudre ce type de problèmes?
Grâce
source d'informationauteur pistacchio
Vous devez vous connecter pour publier un commentaire.
Vous voudrez probablement utiliser la
TempData
de la propriété, ce sera persisté à travers à la prochaine requête HTTP.Pourquoi ne pas gérer la connexion via AJAX au lieu d'un post complet? Vous pourrait facilement fournir l'état, une URL de redirection, et les messages d'erreur via JSON.
Côté Client
Normalement pour la plupart des sites web, lorsque l'utilisateur ne parviennent pas à s'authentifier (en raison de mot de passe), il faudra passer à une autre page qui aide à l'utilisateur (comme le mot de passe de récupération, ou de demander à l'utilisateur de s'inscrire) ce qui est rare pour rester dans la même page. Je pense que vous pouvez re-considérer que vous avez vraiment besoin de la navigation que vous utilisez.
OK, une seule solution si vous voulez vraiment vous tenez à votre modèle, est que vous pouvez joindre l'erreur de connexion à l'URL. Par exemple, http://www.example.com/index.aspx?login_error=1 indique que l'erreur se produit, vous pouvez utiliser BEGIN_REQUEST (ou Module HTTP) pour saisir cela, et dites-le modèle de l'état sur l'erreur:
BTW, ajouter l'erreur du modèle est en fait un plus bonne façon d'informer l'opinion sur toute erreur plutôt que d'utiliser ViewState (ce qui est similaire à jeter exception vs renvoyant un entier sur le résultat de l'exécution dans les vieux jours).
Tout en utilisant l'AJAX login (comme suggéré par tvanfosson) est parfaitement possible, et parfois de l'excellence de l'expérience utilisateur, classique-post est toujours inreplacable (tenir compte de certains utilisateur de désactiver le javascript, ou même sur mon dump WM6 combiné qui ne supporte pas javascript).
Je suis confus. Ne pas
juste retour de la page en cours de retour?
Donc dans votre cas, lorsque la connexion échoue, définissez votre viewdata et de retour d'appel Afficher();
c'est à dire
Êtes-vous à l'aide de la [Autoriser] décorateur? Le MVC processus d'ouverture de session automatique invites avec la page de connexion, puis vous renvoie à l'action de contrôleur que vous essayez d'exécuter. Coupe vers le bas sur un lot de redirection.
L'exemple suivant devrait vous aider dans la résolution de ce problème:
Vue.aspx
AccountController.cs
Vous ne serez pas en mesure de capturer les informations ajoutées dans ViewData après action de Redirection. de sorte que la bonne approche est de retour le même point de Vue() et utiliser ModelState pour les erreurs, comme mentionné par "xandy".
Espère que cela donnerait u une longueur d'avance avec la validation d'un formulaire.