2 votes

La redirection de ReturnUrl de MVC 3 ne fonctionne pas

J'ai une question probablement très bête mais je vais quand même la poser.

Voici le code dans mon contrôleur pour l'ouverture de session

 [HttpPost]
        public ActionResult Index(LogonModel model, string ReturnUrl)
        {
            ReturnUrl = Request.QueryString["ReturnUrl"];
            if (ModelState.IsValid)
            {
                if (UserRepository.validLogin(model.Username, model.Password))
                {
                    UserLogRepository.createLogEntry("Log On", " has logged on to the Staff Portal.", "Entry/Exit");
                    if (ReturnUrl.Length > 1)
                    {
                        return Redirect(Request.QueryString["ReturnUrl"]);
                    }
                    else
                    {
                        return RedirectToAction("Dashboard", "Home");
                    }
                }
                else
                {

                    ModelState.AddModelError("", Session["Error"].ToString());
                }
            }
            // If we got this far, something failed, redisplay form
            return View(model);
        }

Comme vous pouvez le voir, je vérifie juste si le returnurl a une longueur à des fins de test avant de le verrouiller davantage. Mon problème est que j'obtiens un "Object reference not set to an instance of an object" pointant sur cette ligne "if (ReturnUrl.Length > 1)".

Maintenant, l'URL que j'ai lorsqu'un utilisateur a quitté le site dans les délais est la suivante : http://localhost/Dispatch2012/Staff/Home?ReturnUrl=Dispatch2012%2FStaff%2FCredential

Comme vous pouvez le voir, il s'agit de la redirection standard créée par MVC 3. J'ai essayé de lire le ReturnUrl comme une chaîne de requête standard, mais à chaque fois, le système indique que l'objet n'existe pas. Qu'est-ce que j'ai raté ?

5voto

George Stocker Points 31258

La façon dont votre contrôleur est configuré me semble étrange, mais plongeons-y :

    [HttpPost]
    public ActionResult Index(LogonModel model, string returnUrl) //changed
    {
        ReturnUrl = returnUrl; //changed
        if (ModelState.IsValid)
        {
            if (UserRepository.validLogin(model.Username, model.Password))
            {
                UserLogRepository.createLogEntry("Log On", string.Format("{0} has logged on to the Staff Portal.", model.Username, "Entry/Exit"); //changed
                if (ReturnUrl.Length > 1) //this should use IsLocalUrl
                {
                    return Redirect(Request.QueryString["ReturnUrl"]);
                }
                else
                {
                    return RedirectToAction("Dashboard", "Home");
                }
            }
            else
            {

                ModelState.AddModelError("", Session["Error"].ToString());
            }
        }
        // If we got this far, something failed, redisplay form
        return View(model);
    }

Quelques trucs :

  1. Votre returnUrl doit être vérifiée pour s'assurer qu'il s'agit d'une URL locale. Il existe plusieurs façons de le faire, et puisque vous utilisez ASP.NET MVC 3, il est intégré .

  2. Pourquoi tirez-vous le ReturnUrl de la chaîne de requête alors que (si vous avez configuré votre vue correctement), il est déjà transmis ?

Avez-vous les éléments suivants à votre avis ?

<%= Html.Hidden("returnUrl", Url.Encode(Url.Action("ActionToRedirectTo", "ControllerName", new { id = Model.Whatever}))) %>

Si c'est le cas, lorsqu'il publiera, il sera automatiquement envoyé à l'adresse suivante Index L'action en tant que returnUrl paramètre.

Je parie que puisque ça ne fonctionne pas, vous ne renvoyez pas correctement le ReturnUrl, vérifiez ce que j'ai dit à propos de la vue. Oh, et assurez-vous que vous codifiez l'URL de l'élément ReturnUrl .

Aussi, puisque c'est un HttpPost la chaîne de recherche ne contiendrait pas l'URL de retour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X