在 ASP.Net-MVC 中的控制器之间传递信息
Posted
技术标签:
【中文标题】在 ASP.Net-MVC 中的控制器之间传递信息【英文标题】:Passing Information Between Controllers in ASP.Net-MVC 【发布时间】:2011-01-17 04:23:45 【问题描述】:这是How to RedirectToAction in ASP.NET MVC without losing request data的副本
嗨,我遇到了一个问题,这让我有点摸不着头脑。基本上我有一个登录页面 Login.aspx ,其中包含用户名和密码字段,以及一个重要的小复选框。登录在 AccountController Login 方法中处理。目前代码如下:
[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");
基本上,如果行return Redirect(returnUrl);触发,然后它将在另一个控制器 OpenIDController 中结束,正是这种情况下 sendStoredInfo 布尔值变得很重要。但问题是当我在 OpenIDController 中时我没有参考它。如何发送此值?
【问题讨论】:
【参考方案1】:将调用改为:
return RedirectToAction("LoginFailed", new sendFlag = sendStoredInfo );
控制器操作方法签名可能类似于:
public ActionResult LoginFailed(bool sendFlag)
...
【讨论】:
【参考方案2】:还可以考虑使用 TempData 将数据从控制器传递到控制器。这可能是有利的,因为您不必将bool sendFlag
接口潜在地暴露给用户。
第一个控制器中的代码:
TempData["sendFlag"] = sendStoredInfo;
return RedirectToAction("LoginFailed");
第二个控制器中的代码:
public ActionResult LoginFailed()
bool sendFlag = TempData.ContainsKey("sendFlag")? TempData["sendFlag"]: false;
【讨论】:
感谢 Jace Rhea,我已经做出了建议的更改。 为什么这个 bool sendFlag = TempData.ContainsKey("sendFlag")?临时数据[“sendFlag”]:假;会抛出一个异常说“对象空引用”?【参考方案3】:由于重定向的性质,您只能执行 GET 操作。
这意味着您必须将参数作为查询字符串的一部分传递。
所以你会重定向到像http://host/dir/page?sendStoredInfo=true这样的网址
然后,您可以选择在其他控制器中将其作为方法签名的一部分,或者,您可以选择使用 HttpContext 为操作公开的 HttpRequest 直接访问它。
您也可以按照上一个问题调用 RedirectToAction:
How to RedirectToAction in ASP.NET MVC without losing request data
【讨论】:
【参考方案4】:据我所知,存在四种不同的方法来处理 asp.net MVC 中控制器之间的数据传递。它们是 1. ViewData 2. ViewBag 3. TempData 和 4. Sessions。如果除了可下载的示例之外,您还希望得到一个比较好的解释,请查看here
【讨论】:
以上是关于在 ASP.Net-MVC 中的控制器之间传递信息的主要内容,如果未能解决你的问题,请参考以下文章
如何将消息从我的存储库类返回到我的控制器,然后返回到我在 asp.net-mvc 中的视图?