在 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中Entity和Model之间的关系

如何将消息从我的存储库类返回到我的控制器,然后返回到我在 asp.net-mvc 中的视图?

如何在 asp.net-mvc 控制器中集中授权逻辑?

模拟 Asp.net-mvc 控制器上下文

在 asp.net-mvc 中从服务器读取文本文件的最佳方法是啥

asp.net-mvc:js文件中的剃刀'@'符号