为什么出现在地址栏中的ReturnUrl返回null参数?

时间:2019-02-13 21:10:25

标签: asp.net asp.net-mvc

尽管 returnUrl 字符串已打印在地址栏中,但可能又成为空值的原因又是什么呢?在他的表单中,我创建了隐藏的输入标签,以捕获URL并将其传递给ActionResult参数:

        [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);
        }

因此,点击提交按钮后,我将被重定向到Account Controller / Login ActionResult,其中ReturnUrl参数为null

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

我还尝试将qerystring作为参数添加到Beginform括号内,如下所示:

int myArray[200];
std::iota(std::begin(myArray), std::end(myArray), 100);

也不起作用。

2 个答案:

答案 0 :(得分:1)

您似乎缺少name的{​​{1}}标签

input

name属性必须与动作参数名称相同。

答案 1 :(得分:1)

问题是您使用隐藏字段存储重定向的返回URL,该URL将作为Request.Form集合的一部分而不是控制器的POST操作方法中的单个操作参数发送。为了确保在表单提交过程中包括返回URL,建议您首先在视图模型中添加返回URL属性:

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)

最后,返回网址可以在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);
}