重定向后TempData []不起作用

时间:2014-10-22 13:34:06

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

我正在尝试使用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的构造函数中有以下辅助类:

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

我希望在到达ViewBag Edit时填充Action个项目:

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

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

我不知道TempData[]有哪些因素,例如它只在同一个控制器中有效,或者只对单个动作有效吗?

1 个答案:

答案 0 :(得分:2)

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

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

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