从我读到的内容来看,当前请求和下一个请求(以便您可以通过重定向传递信息)将放置在TempData中。问题是如果我浏览到一个不重定向的控制器动作,那么TempData中的信息仍然会出现在下一个请求中。我使用TempData存储显示给用户的信息性消息,所以现在我也在第二个屏幕上获取第一个屏幕的消息。ASP.NET MVC:控制器方法执行后清除TempData
在控制器生命周期中,有没有一段时间清除TempData,一旦它不再被使用?
从我读到的内容来看,当前请求和下一个请求(以便您可以通过重定向传递信息)将放置在TempData中。问题是如果我浏览到一个不重定向的控制器动作,那么TempData中的信息仍然会出现在下一个请求中。我使用TempData存储显示给用户的信息性消息,所以现在我也在第二个屏幕上获取第一个屏幕的消息。ASP.NET MVC:控制器方法执行后清除TempData
在控制器生命周期中,有没有一段时间清除TempData,一旦它不再被使用?
Use ViewData instead of TempData if you are not redirecting。你永远不需要手动清除TempData。如果您只在重定向时使用它,它会自动并在正确的时间为您清除。
我想你应该使用ViewData,如果你不使用POST-REDIRECT-GET。但如果你真的需要的行为你所描述上面,你应该创建自己的定制TempDataProvider:
public class YourTempDataProvider : SessionStateTempDataProvider
{
public override void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
{
bool redirecting = ...
if(redirecting)
{
base.SaveTempData(controllerContext, values);
}
}
}
我不会找一个地方在这里,比定制TempDataProvider等。但这很棘手。如果你想要在其他控制器中的常规行为呢?我现在就是YAGNI,只是清除它,你需要清除它。当你注意到一个图案时,你可以将它拉到一些平常的地方。
但是如果我的控制器动作_is_重定向?在这种情况下,我无法使用ViewData,因为消息不再存在。 有没有更好的方式来处理这样的显示消息,而不是将它存储在TempData/ViewData中? – 2009-05-22 17:18:00
当您重定向时,您需要使用ViewData,而在重定向时需要使用TempData。在这两种情况下,一切都是自动的。要显示你,然后写 TempData [“key”] ?? ViewData [“key”] 在您的视图中。 – 2009-05-22 17:23:21