C# 重定向后TempData[]不工作

C# 重定向后TempData[]不工作,c#,asp.net-mvc,asp.net-mvc-5,viewbag,tempdata,C#,Asp.net Mvc,Asp.net Mvc 5,Viewbag,Tempdata,我正在尝试使用mvcTempData[]向另一个控制器发送错误消息,并重定向: 控制器1: TempData["Message"] = "A password reset email has been sent to " + user.Email + ". This link in only valid for 24 hours."; return RedirectToAct

我正在尝试使用mvc
TempData[]
向另一个控制器发送错误消息,并重定向:

控制器1:

    TempData["Message"] = "A password reset email has been sent to " + user.Email +
                                     ". This link in only valid for 24 hours.";
                    return RedirectToAction("Edit", "Users", new { id = userId });
然后,我在控制器2的构造函数中有以下helper类:

public UsersController()
    {            
        NotificationHelper.GetViewDataNotifications(this);
    }
以下是帮助器类:

 public static void GetViewDataNotifications(ControllerBase controller)
    {
         var message =controller.TempData["Message"] ?? "";
        controller.ViewBag.Message = message;

         var errorMessage = controller.TempData["ErrorMessage"] ?? "";
        controller.ViewBag.ErrorMessage = errorMessage;

         var infoMessage= controller.TempData["InfoMessage"] ?? "";
        controller.ViewBag.InfoMessage = infoMessage;

        var warningMessage = controller.TempData["WarningMessage"] ?? "";
        controller.ViewBag.WarningMessage = warningMessage;
    }
然后,我希望在我进入
Edit
操作时填充
ViewBag
项目:

public async Task<ActionResult> Edit(int? id)
    {
     ...
     return View();
    }
公共异步任务编辑(int?id)
{
...
返回视图();
}
然而,在我的helper类中,TempData似乎总是空的。我错过了什么


是否存在我不知道的
TempData[]
的某些因素,例如它仅在同一控制器中有效或仅对单个操作有效?

当控制器的构造函数中的TempData仍然为空时,您正试图访问它。此时,控制器甚至还没有完全构造,更不用说初始化了

您应该提取动作中的TempData值。TempData在控制器构造之后但在授权和模型绑定之前至少三步初始化


这详细描述了控制器的生命周期。虽然您可以覆盖TempData初始化(
CreateTempDataProvider
)和实际操作之间的一个步骤,但这并没有多大意义。

不要在构造函数中调用该方法。此时,控制器甚至还没有完全构造好。像TempData这样的属性尚未加载。因此,我是否应该在需要的操作中调用我的帮助程序?@Zapnologica是的,这是正确的。好的,我会尝试,我这样做是为了不必在每个操作方法中重复代码。无论如何,不需要这个帮助程序。只需在视图中直接访问
TempData
。无需先在
ViewBag
中设置值。你所做的只是将数据从一个动态存储位置移动到另一个位置。是的,当我第一次了解到直到MVC决定之前,甚至控制器都不会实例化时,我花了一段时间。我曾经“认为”一旦它们被实例化,它们就会停留在服务器端。将全局变量放入控制器对我个人来说效果不太好,我建议任何人不要这样做。将控制器视为路由的最终结果,路由实例化模型并发送正确的视图。不多也不少。每个请求都会实例化和处理控制器:非常简单。全局变量和静态变量是不行的,因为它们不是线程安全的。@ChrisPratt你这么说很有趣。mvc 5中的默认支架使用
EF db context
作为全局生成控制器,并在控制器中实例化。然后在每个动作中使用。这也不正确吗?这不是一个全球性的问题。它是一个实例变量。每次实例化控制器时,都会实例化并存储一个新的上下文,因此它是线程安全的。