这是How to RedirectToAction in ASP.NET MVC without losing request data
的副本嗨,我遇到了一个问题,这让我有点头疼。基本上我有一个登录页面Login.aspx,它有用户名和密码字段,以及一个重要的小复选框。登录在AccountController登录方法中处理。代码目前如下:
[AcceptVerbs(HttpVerbs.Post)]
[SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
Justification =
"Needs to take same parameter type as Controller.Redirect()")]
public ActionResult LogOn(string userName, string password, string returnUrl,
bool sendStoredInfo)
{
if (!this.ValidateLogOn(userName, password)) {
return View();
}
this.FormsAuth.SignIn(userName, false);
if (!String.IsNullOrEmpty(returnUrl)) {
return Redirect(returnUrl);
} else {
return RedirectToAction("Index", "Home");
}
}
基本上,如果该行返回Redirect(returnUrl);然后它会在另一个控制器OpenIDController中结束,这就是sendStoredInfo bool变得重要的情况。但问题是当我在OpenIDController中时,我没有引用它。如何发送此值?
答案 0 :(得分:14)
还要考虑使用TempData将数据从控制器传递到控制器。这可能是有利的,因为您不必将bool sendFlag
接口可能暴露给用户。
第一个控制器中的代码:
TempData["sendFlag"] = sendStoredInfo;
return RedirectToAction("LoginFailed");
第二个控制器中的代码:
public ActionResult LoginFailed()
{
bool sendFlag = TempData.ContainsKey("sendFlag")? TempData["sendFlag"]: false;
}
答案 1 :(得分:13)
将通话更改为:
return RedirectToAction("LoginFailed", new { sendFlag = sendStoredInfo });
控制器操作方法签名可能类似于:
public ActionResult LoginFailed(bool sendFlag)
{
...
}
答案 2 :(得分:1)
由于重定向的性质,您只能执行GET操作。
这意味着您必须将参数作为查询字符串的一部分传递。
因此,您会重定向到http://host/dir/page?sendStoredInfo=true
这样的网址然后,您可以选择将其作为方法签名的一部分放在另一个控制器中,或者,您可以选择使用HttpContext公开的HttpRequest直接访问它以进行操作。
您也可以按照上一个问题调用RedirectToAction:
How to RedirectToAction in ASP.NET MVC without losing request data
答案 3 :(得分:1)
据我所熟知,有四种不同的方法可以处理asp.net MVC中控制器之间的数据传递。它们是1.ViewData 2. ViewBag 3. TempData和4. Sessions。如果除了可下载的示例之外您可能还需要相对较好的解释,请查看here