在ASP.Net-MVC中的控制器之间传递信息

时间:2010-02-15 22:27:25

标签: asp.net-mvc

这是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中时,我没有引用它。如何发送此值?

4 个答案:

答案 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