注销后将消息B / w控制器传递给查看页面

时间:2016-02-25 07:45:12

标签: asp.net-mvc viewbag tempdata

我必须从控制器1向控制器3发送消息,最后发送到视图  控制器1

public ActionResult controller1()
{
    TempData["data"] = "work finish.";
    return RedirectToAction("logoff");
}

然后在控制器2中

    public ActionResult logoff()
    {
        AuthenticationManager.SignOut();
        Session.Abandon();
        return RedirectToAction("index");
    }

控制器3

    public ActionResult index()
    {
        ViewBag.data = TempData["data"] as string;
        return View();
    }

在视图页面

<span>@ViewBag.data</span>

返回空消息。 提前谢谢。

1 个答案:

答案 0 :(得分:-2)

在这种情况下,您应该避免使用TempData。如果你知道你需要超过1个控制器动作的值,那么TempData不适合你,因为一旦你访问它就会被删除(免责声明:如果你使用Peek()它会被持久化,但这不是讨论)

我认为对您有用的是根据操作结果使用URL中的参数重定向。你可以这样做:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:                    
            TempData["data"] = "Login Success";
            return RedirectToAction("Action", new { loginSuccessful = true });
        default:
            ModelState.AddModelError("", "Invalid login attempt.");
            return View(model);
    }
}

然后在controller2中你会得到这样的代码:

public class SampleController : Controller
{
    public SampleController()
    {

    }

    public ActionResult Index(bool loginSuccessful)
    {
        if (loginSuccessful)
        {
            ViewBag["message"] = "Login successful";
        }
        return View();
    }
}

如果任何其他控制器操作需要该参数,您只需将其添加到函数签名中,就像我在Index操作中所做的那样,只要参数仍在URL中,它就会起作用。