【问题标题】:Why does ReturnUrl return null parameter though it shows up in the adress bar?为什么 ReturnUrl 显示在地址栏中却返回 null 参数?
【发布时间】:2019-07-07 20:01:09
【问题描述】:

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"/>
        }

所以在点击提交按钮后,我被重定向到 Account controller/Login ActionResult,ReturnUrl 参数为空

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

我还尝试将查询字符串作为参数添加到 Beginform 的括号内,如下所示:

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

也没有用。

【问题讨论】:

  • Url.RequestContext.HttpContext.Request.QueryString["ReturnUrl"]Request.QueryString["ReturnUrl"]中返回了什么样的URL?如果两者都是 null 或空字符串,请尝试HttpContext.Request.UrlReferrer.Query

标签: asp.net asp.net-mvc


【解决方案1】:

您似乎缺少inputname 标签

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

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

【讨论】:

  • 很好的检测亚历克斯。问题解决了
【解决方案2】:

问题是您使用隐藏字段来存储重定向的返回 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)

最后,返回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);
}

【讨论】:

  • 相当简单和明智的出路..值得被接受的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多