如何在ASP.Net MVC中使用RedirectToAction传递tempdata

4

我需要在其中一个视图中传递成功的注销消息,但我无法这样做。以下是我的代码:

无效的解决方案:

 //LogController:
  public ActionResult Logoff()
  {
      DoLogOff();
      TempData["Message"] = "Success";
      return RedirectToAction("Index", "Home");
  }

  // HomeController
  public ActionResult Index()
  {
      return View();
  }

Index CSHTML文件:

@Html.Partial("../Home/DisplayPreview")

显示预览的 CSHTML 文件:

   @TempData["Message"] 

可行解决方案

public ActionResult Logoff()
{
     DoLogOff();
     return RedirectToAction("Index", "Home", new { message = "Logout Successful!" });
}

public ActionResult Index(string message)
{
    if (!string.IsNullOrEmpty(message))
        TempData["Message"] = message;
    return View();
}

Index CSHTML文件:

   @TempData["Message"] 

但我想要类似于我的第一个解决方案的东西。

1
你是不是把“工作”和“不工作”的解决方案搞混了?因为你所称之为“不工作”的方式是唯一能够成功的,而你称之为“工作”的方式肯定行不通。 - Chris Pratt
不,麻烦再看一眼。它们在不同的控制器中。 - Unbreakable
为什么会有负面评价? - Unbreakable
让我们在聊天中继续这个讨论 - Unbreakable
1
你已经找到了一个可行的解决方案。为什么还要关心TempData?一切依赖于ASP.NET会话(因此依赖于服务器端状态)的东西都应该避免使用。 - Darin Dimitrov
显示剩余3条评论
4个回答

2
在控制器中;
public ActionResult Index()
{
    ViewBag.Message = TempData["Message"];
    return View();
}
public ActionResult Logoff()
{
    DoLogOff();
    TempData["Message"] = "Success";
    return RedirectToAction("Index", "Home");
}

然后你可以在视图中像这样使用它:
@ViewBag.Message

1
本地主机调试时,使用RedirectToAction调用会清除临时数据。 - jjxtra

0

嗨,我想分享我的版本

    public ActionResult List(string success,string error)
    {
            TempData["success"] = success;
            TempData["error"] = error;

      return View();
    }
     
    
    public ActionResult Add()
    {
     return RedirectToAction("List",new
       {
         error = "not added",
         success = "added"
       });
    }

目前你的回答不够清晰,请[编辑]以添加更多细节,帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

由于您没有展示DoLogOff()的功能,我猜测您是放弃了会话,这意味着任何存储在会话中的数据(如TempData)都将丢失。新会话直到下一页刷新才会生成,因此它不起作用。

您可以尝试的方法是向Index视图传递一个标志,如果存在已注销的消息,则显示该消息。我不建议使用字符串消息,就像您在“工作”示例中展示的那样,因为攻击者可以利用它将人们重定向到恶意站点。


是的,你说得对。我刚刚看到了代码。在我的DolLogoff()函数中,我调用了Session.abandonSession.Clear。所以你希望我在index视图中传递一个布尔变量作为参数,而不是字符串? - Unbreakable
@Unbreakable - 这是一种可能性,还有其他几种方法可以实现这个功能,这只是一个例子。您不希望传递字符串,因为某些人可能会在其中插入JavaScript代码,从而造成不良影响。 - Erik Funkenbusch
如果你有时间,能否给我提供一小段代码片段,告诉我应该怎么做。 - Unbreakable
return RedirectToAction(action, homeController, new { showMes = "true" }); 如何从这里传递布尔值? - Unbreakable

0

看看这个是否有效:

public ActionResult Logoff()
{
    DoLogOff();
    ControllerContext.Controller.TempData["Message"] = "Success";
    return RedirectToAction("Index", "Home");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接