我必须从控制器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>
返回空消息。 提前谢谢。
答案 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中,它就会起作用。