Почему ReturnUrl возвращает нулевой параметр, хотя он отображается в адресной строке? - PullRequest
0 голосов
/ 14 февраля 2019

В чем может быть причина для returnUrl строки, возвращающей нулевое значение, хотя она напечатана в строке адреса.В форме я создал скрытый тег ввода, чтобы перехватить URL-адрес и передать его в параметр ActionResult:

    @using (Html.BeginForm("Login", "Account", FormMethod.Post, ))
        {
                 @Html.AntiForgeryToken()
                 <input type="hidden" value="@Url.RequestContext.HttpContext.Request.QueryString["ReturnUrl"]"/>
               <input type="submit" value="Enter" class="btn btn-primary"/>
        }

Так что после нажатия кнопки «Отправить» я перенаправлен на контроллер учетной записи / Login ActionResult сПараметр ReturnUrl имеет значение NULL

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Login(LoginModel model,string ReturnUrl)
        {

            if (ModelState.IsValid)
            {
               //some codes
                    if (String.IsNullOrWhiteSpace(ReturnUrl))
                    {
                        return RedirectToAction("HomeIndex", "Home");
                    }
                    else
                    {
                        return Redirect(ReturnUrl);
                    }
                }
                else
                {
                    ModelState.AddModelError("UserLoginError", "Username or password is incorrect");
                }
            }
            return View(model);
        }

Я также пытался добавить строку qerystring в качестве параметра в скобках Beginform следующим образом:

@using (Html.BeginForm("Login", "Account", FormMethod.Post, new { ReturnUrl = Request.QueryString["ReturnUrl"] } )) 

Также не сработало.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Проблема в том, что вы используете скрытое поле для хранения возвращаемого URL для перенаправления, которое будет отправлено как часть Request.Form коллекции вместо отдельного параметра действия в методе действия контроллера POST.Чтобы убедиться, что возвращаемый URL включен во время отправки формы, я предлагаю вам сначала добавить свойство возвращаемого URL в viewmodel:

public class LoginModel
{
    // other existing properties

    public string ReturnUrl { get; set; }
}

Затем установить значение в действии GET, которое отображает форму входа:

[HttpGet]
public ActionResult Login(string returnUrl)
{
    var model = new LoginModel() { ReturnUrl = returnUrl };
    return View(model);
}

И вы можете предоставить скрытое поле внутри формы для хранения его значения:

@* using input hidden tag *@
<input name="ReturnUrl" value="@Model.ReturnUrl" type="hidden" />

@* using HTML helper *@
@Html.HiddenFor(model => model.ReturnUrl)

Наконец, возвращаемый URL-адрес может быть передан внутри экземпляра LoginModel, нет необходимости указывать дополнительный параметр:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model)
{
    if (ModelState.IsValid)
    {
        //some codes
        if (String.IsNullOrWhiteSpace(model.ReturnUrl))
        {
            return RedirectToAction("HomeIndex", "Home");
        }
        else
        {
            return Redirect(model.ReturnUrl);
        }
    }
    else
    {
        ModelState.AddModelError("UserLoginError", "Username or password is incorrect");
    }
    return View(model);
}
0 голосов
/ 14 февраля 2019

Похоже, вам не хватает name тега для input

<input type="hidden" name="returnUrl" value="@Url.RequestContext.HttpContext.Request.QueryString["ReturnUrl"]"/>

Атрибут name должен совпадать с именем параметра действия.

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