J'ai une page de connexion. Dans mon web.config je configure un loginUrl de sorte que si un utilisateur essaye d'aller à une page "autorisée" et ne soit pas autorisé ils seront redirigés vers la page de connexion.Avoir des problèmes avec Asp.net MVC passant dans un querystring comme paramètre
Maintenant, j'ai remarqué que lorsque cela se produit et que l'utilisateur est redirigé depuis une page "Autorisé", l'URL de la page à laquelle il est redirigé est ajoutée à l'URL de connexion.
Ainsi, quand ils se connectent, je peux les utiliser pour les renvoyer à la page qu'ils essayaient d'obtenir.
Voilà donc comment l'URL regarderait:
http://localhost:2505/CMS_Account/LogOn?ReturnUrl=%2fCMS_Home%2fIndex
Je suis en train de capturer le ReturnUrl querystring partie en tant que paramètre à mon avis.
Mais je n'arrive pas à le faire fonctionner.
Je suis donc trouvé si je change mon formulaire pour la connexion à ceci:
<% using (Html.BeginForm()) ........
Ensuite, je peux saisir l'ReturnUrl pour une raison quelconque aucun problème.
Mais comment je l'ai, j'ai en ce moment ceci:
<% using (Html.BeginForm("Login","Authentication",FormMethod.Post,new { id = "frm_Login"})) .....
Une fois que je tente de transmettre les paramètres dans le BeginForm il arrête la capture de l'ReturnUrl.
Je ne sais pas pourquoi ça s'arrête. Certaines personnes disent que c'est parce que j'utilise la route par défaut et d'une manière ou d'une autre, si vous ne mettez rien dans l'beingForm, il est possible de trouver par magie le ReturnUrl avec l'URL par défaut. Dès que vous mettez quelque chose dans BeginForm, il semble être bête et vous devez lui donner une route pour lui dire quoi faire.
Je ne sais pas comment écrire cet itinéraire. J'ai essayé pas mal de combinaisons différentes et elles ont toutes échoué, et tout le monde qui me dit juste une route ne me dit jamais à quoi cela devrait ressembler.
Donc je ne sais plus quoi essayer.
Ce que j'ai essayé
routes.MapRoute(
"CMS_Account", // Route name
"CMS_Account/{action}/{ReturnUrl}", // URL with parameters
new { controller = "CMS_Account", action = "LogOn",} // Parameter defaults
);
routes.MapRoute(
"CMS_Account", // Route name
"CMS_Account/{action}/{ReturnUrl}", // URL with parameters
new { controller = "CMS_Account", action = "LogOn", ReturnUrl = ""} // Parameter defaults
);
routes.MapRoute(
"CMS_Account", // Route name
"{controller}/{action}/{ReturnUrl}", // URL with parameters
new { controller = "CMS_Account", action = "LogOn", ReturnUrl = ""} // Parameter defaults
);
routes.MapRoute(
"CMS_Account", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "CMS_Account", action = "LogOn", id = ""} // Parameter defaults
);
routes.MapRoute(
"CMS_Account", // Route name
"{controller}/{action}/", // URL with parameters
new { controller = "CMS_Account", action = "LogOn"} // Parameter defaults
);
Hmm intéressant. Donc, fondamentalement, mettre ceci dans la valeur par défaut ActionResult (j'en ai 2 pour charger sans une requête "Post" et une pour.) Pour un, je ne vous ferais pas la première chose car cela entraînerait l'échec de la validation de w3c (le formulaire n'a pas attribut returnValue) et j'ai plutôt que ça passe. Le caché Je suppose que je pourrais faire celui-là mais j'essaie toujours de comprendre pourquoi laisser BeginForm vide peut trouver par magie comment le prendre de la chaîne de requête, mais quand j'ai "Post" réglé il ne peut pas. Je trouve juste que c'est tellement bizarre. – chobo2
Désolé ... fait l'erreur d'ajouter returnUrl à la collection HtmlAttributes plutôt qu'à RouteValueCollection. J'ai édité la réponse pour refléter cela. – Charlino
La raison pour laquelle un BeginForm() vide fonctionne est parce que quand vous utilisez un BeginForm vide(), il prend juste l'URL courante et l'utilise pour l'attribut 'action' du formulaire/url-i.e. Et parce que l'URL actuelle contient la valeur de la chaîne de requête ReturnUrl, elle sera dans l'attribut 'action' du formulaire. Mais quand vous commencez à passer des choses dans BeginForm(), le moteur de routage prend le relais et construit lui-même l'attribut/l'action 'action' du formulaire, donc vous perdrez la chaîne de requête ReturnUrl sauf si vous la remettez dans l'attribut action/url querystring ou dans une entrée cachée. – Charlino