2009-05-22 39 views
6

从我读到的内容来看,当前请求和下一个请求(以便您可以通过重定向传递信息)将放置在TempData中。问题是如果我浏览到一个不重定向的控制器动作,那么TempData中的信息仍然会出现在下一个请求中。我使用TempData存储显示给用户的信息性消息,所以现在我也在第二个屏幕上获取第一个屏幕的消息。ASP.NET MVC:控制器方法执行后清除TempData

在控制器生命周期中,有没有一段时间清除TempData,一旦它不再被使用?

回答

7

Use ViewData instead of TempData if you are not redirecting。你永远不需要手动清除TempData。如果您只在重定向时使用它,它会自动并在正确的时间为您清除。

+0

但是如果我的控制器动作_is_重定向?在这种情况下,我无法使用ViewData,因为消息不再存在。 有没有更好的方式来处理这样的显示消息,而不是将它存储在TempData/ViewData中? – 2009-05-22 17:18:00

+0

当您重定向时,您需要使用ViewData,而在重定向时需要使用TempData。在这两种情况下,一切都是自动的。要显示你,然后写 TempData [“key”] ?? ViewData [“key”] 在您的视图中。 – 2009-05-22 17:23:21

0

我想你应该使用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); 
     } 
    } 
} 
0

我不会找一个地方在这里,比定制TempDataProvider等。但这很棘手。如果你想要在其他控制器中的常规行为呢?我现在就是YAGNI,只是清除它,你需要清除它。当你注意到一个图案时,你可以将它拉到一些平常的地方。