尽管 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);
也不起作用。
答案 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);
}