【问题标题】:Passing Information Between Controllers in ASP.Net-MVC在 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 中时我没有参考它。如何发送此值?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-28
          • 1970-01-01
          相关资源
          最近更新 更多