如何在查看渲染后清除会话

时间:2015-06-29 20:44:26

标签: c# asp.net-mvc asp.net-mvc-5 httpcontext

这最初看起来像一场游戏,但我一点一点地结束了这个问题很长一段时间。这是我的情况。我从我的域模型中激活通知。

这些通知只是包含标题和描述的对象,我将其存储在一个集合中,以便将它们呈现在我网站页面的顶部。但是我很难找到适合MVC的“会话”机制。

我首先使用HttpContext.Items来存储我的所有会话数据,但我发现它不适合重定向方案 - 当我将用户重定向到另一个Action方法时。实际上,创建了一个新的HttpContext,并且Items对象丢失了。

因此我尝试将会话内容存储在HttpContext.Session中,但我现在遇到的问题是没有适当的时间来清除会话(我不想从一个请求到另一个请求进行通知)。 OnActionExecuted和OnResultExecuted似乎在View渲染之前运行。

以下是我在布局页面中显示通知的方式:

@foreach(var notification in ISession.Notifications)
{
   @Html.Partial("_NotificationPartial", new Mvc.Models.NotificationViewModel(notification))
}

ISession映射到我的IOC容器中的商店(HttpContext.Items / HttpContext.Session)。

你有任何解决方法吗?

1 个答案:

答案 0 :(得分:1)

尝试使用TempDataDictionary。它作为TempData属性包含在Controller基类中。它旨在将数据从一个请求持久保存到另一个请求。然后它会自动清除。

在动作方法中:

TempData["Notifications"] = new List<Notification>()

在视图中:

@{
    if(TempData["Notifications"] != null)
    {
        var notifications = TempData["Notifications"] as List<Notification>
    }
}