ReturnUrl в asp.net mvc по какой-то причине является нулевым - PullRequest
4 голосов
/ 27 февраля 2012
public ActionResult LogOn(string returnUrl)
        {
            if (Request.IsAuthenticated)
            {
                return RedirectToAction(string.Empty, "home");
            }
            else
            {
                if (!string.IsNullOrWhiteSpace(returnUrl))
                {
               //http://localhost:666/en-us/account/logon?returnurl=%2fen-us%2fadminka
                     //..............
                }
                return View();

            }
        }

        [HttpPost]
        public ActionResult LogOn(LogOnViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (....)
                {
                    //..............
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                        return Redirect(returnUrl);
                    return RedirectToAction(string.Empty, "home");

                }
                else
                {
                    //..............
                }
            }

            return View(model);
        }

В HttpPost LogOn returnUrl всегда равно нулю, даже если оно было не пусто в HttpGet LogOn.

Почему?Как мне это исправить?

Ответы [ 3 ]

11 голосов
/ 27 февраля 2012

Вы должны вернуть returnUrl вместе с формой поста.

Вероятно, самое чистое решение - добавить returnUrl в качестве свойства в LogOnViewModel:

    public class LogOnViewModel
{
    public string UserName { get; set; }
    public string Password { get; set; }
    public string ReturnUrl { get; set; }
}

Ваш метод get установит это значение:

[HttpGet]
public ActionResult LogOn(string returnUrl)
    {
       // code for already authenticated case left out for demo
            var model = new LogOnViewModel { ReturnUrl = returnUrl };
            return View(model);

        }
    }

В вашей форме вы сохраните это значение как скрытое поле:

@using (Html.BeginForm())
{
    @Html.HiddenFor(model => model.ReturnUrl)

    // rest of form code left out for demo purposes
}

Ваш метод записи будет иметь доступ к этому значению:

    [HttpPost]
    public ActionResult LogOn(LogOnViewModel model)
    {
        if (ModelState.IsValid)
        {
            if (....)
            {   string returnUrl = model.ReturnUrl;

                //..............
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    return Redirect(returnUrl);
                return RedirectToAction(string.Empty, "home");

            }
            else
            {
                //..............
            }
        }

        return View(model);
    }
2 голосов
/ 26 июня 2012

В виде входа в систему добавьте параметр ReturnUrl к действию формы.Например:

BeginForm("LogOn", "Account", new {ReturnUrl = Request.QueryString["ReturnUrl"]})

См. davewasthere ответ .

0 голосов
/ 27 февраля 2012

Когда в представлении LogOn убедитесь, что:

  • либо URL содержит "returnUrl"
  • , либо имеется поле returnUrl в форме
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...