c# - 重定向后 TempData[] 不起作用

标签 c# asp.net-mvc asp.net-mvc-5 viewbag tempdata

我正在尝试使用 mvc TempData[] 通过重定向向另一个 Controller 发送错误消息:

Controller 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 });

然后,我在 Controller 2 的构造函数中拥有以下辅助类:

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 Action 时填充 ViewBag 项:

public async Task<ActionResult> Edit(int? id)
    {
     ...
     return View();
    }

但是在我的帮助器类中,TempData 似乎总是为空。我在这里缺少什么?

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

最佳答案

您试图在 Controller 的构造函数中访问 TempData,但它仍然为空。此时 Controller 还没有完全构建,更不用说初始化了。

您应该在操作中提取 TempData 值。 TempData 在 Controller 构建之后、授权和模型绑定(bind)之前至少初始化三个步骤。

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

关于c# - 重定向后 TempData[] 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26508725/

相关文章:

c# - 多层如何在MVVM模式中工作?

c# - 总结为双倍时从 ForEach 循环转换为 Parallel.ForEach 循环会减慢速度

c# - 即使声明中存在角色,IsInRole 也会返回 false

c# - 运行所选代码生成器时出错 : 'Object reference not set to an instance of an object.' Error?

c# - 在 Deedle 中选择特定行

c# - IActionFilter 和 IAuthorizationFilter 的区别

c# - 检查 web 表单是否在 javascript 中关闭/刷新

asp.net-mvc - 如何在 View 的 javascript 部分访问 ASP MVC 中的 Model.Something 值

javascript - 通过ajax actionlink传递javascript变量来加载部分 View

javascript - asp.net 更改当前 URL 中的 href 参数