Passer returnUrl de ActionLink de vue de Formulaire de Connexion qui redirige revenir à l'affichage des
J'ai lu beaucoup de messages sur returnUrl comme il se rapporte à des formes d'authentification par défaut de [authorize] MyController
, mais je n'ai pas lu quoi que ce soit sur un simple passage de la returnUrl où la seule authentification a lieu après l' [HttpPost] avec une connexion ou un formulaire d'inscription et les utilisateurs anonymes.
Dans ce cas, je veux la redirection à venir à partir du lien d'origine et est passé à l'action, où les utilisateurs sont authentifiés via le formulaire d'authentification. Cette redirection devrait prendre à l'utilisateur de retourner à la page affichée après qu'ils 1) cliquez sur s'inscrire ou se connecter ActionLinks puis 2) envoyer le formulaire avec succès. C'est sur un serveur de dev, donc HTTPS n'est pas une exigence de l'ATM.
Voici les éléments sans la syntaxe nécessaire/code pour le passage de returnUrl
_LoginPartial:
<li>@Html.ActionLink("Register", "Register", "Account", routeValues: null}, htmlAttributes: new { id = "registerLink" })</li> //returnUrl???
<li>@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li> //returnUrl???
De Vue Login:
@using (Html.BeginForm()){...} //new { returnUrl } ???
Login Obtenir ActionResult:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
//There is other ways to store the route
TempData["ReturnUrl"] = returnUrl;
return View();
}
Login Poste ActionResult:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(TempData["ReturnUrl"].ToString());
}
//If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
Solution
Grâce à SlightlyMoist j'ai été en mesure de résoudre le problème. Alors que le code est de petite taille, la capacité et le savoir-faire de ViewContext.RouteData.Values["key"]
semble être d'une valeur inestimable de l'OMI. Donc, la seule modification effectuée par SM a été fait à l'intérieur de la ActionLinks de la _LoginPartial vue:
<li>
@Html.ActionLink("Register", "Register", "Account", routeValues: new {@returnUrl = Url.Action(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), ViewContext.RouteData.Values["id"])}, htmlAttributes: new { id = "registerLink" })
</li>
<li>
@Html.ActionLink("Log in", "Login", "Account", routeValues: new {@returnUrl = Url.Action(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), ViewContext.RouteData.Values["id"])}, htmlAttributes: new { id = "loginLink" })
</li>
AUSSI
Comme par SM encore une fois, la ViewContext.HttpContext.Request.Url.PathAndQuery
fonctionne ainsi:
<li>
@Html.ActionLink("Register", "Register", "Account", routeValues: new {@returnUrl = ViewContext.HttpContext.Request.Url.PathAndQuery},htmlAttributes: new { id = "registerLink" })
</li>
Vous devez vous connecter pour publier un commentaire.
Simplement analyser l'itinéraire actuel /URL routeValue votre login lien d'action.
Quelque chose comme cela devrait faire l'affaire
Idée similaire, mais j'ai simplement ajouté ViewBag.ReturnUrl dans la vue, et modifié les Inscrire et vous connecter méthodes. C'est parce que tous les Login et le Registre des emplacements aurez envie de revenir à la page, et de cette façon vous avez le contrôle sur vue par vue de base.
Et dans le _LoginPartial: