6

我在我的 MVC 应用程序中设置了一个会话变量。每当该会话过期并且用户尝试刷新他们所在的页面时,该页面将引发错误,因为不再设置会话。

有没有什么地方可以在加载视图之前检查会话是否已设置?也许在 Global.asax 文件中放一些东西?

我可以在每个 ActionResult 的开头做这样的事情

public ActionResult ViewRecord()
{
    if (MyClass.SessionName == null)
    {
        return View("Home");
    }
    else
    {
        //do something with the session variable
    }
}

有没有其他方法可以做到这一点?在这种情况下,最佳做法是什么?

4

2 回答 2

5

如果它在一个控制器中,您可以这样做:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    ... // do your magic
}   

它会在任何动作执行之前触发。但是,您不能从那里返回视图,您必须重定向到任何返回操作结果的内容,例如:

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Shared" }, { "action", "Home" } });

但是,显然,这应该重定向到不受覆盖影响的控制器中的操作,否则你有一个循环重定向。:)

于 2012-04-10T14:55:12.093 回答
0

首先,您应该重定向到主页,而不是返回主页视图,否则尽管 URL 位于其他位置,但您仍会出现主页显示的奇怪情况。

其次,Session 永远不会为 Null,因为当旧会话过期或重置时会创建一个新会话。相反,您将检查您的变量,如果 THAT 为空,那么您知道会话是新的。

第三,如果您的应用程序依赖于此会话数据,那么我根本不会使用会话。你用它来缓存数据吗?如果是这样,那么使用 Cache 可能是更好的选择(当缓存项过期时,您的应用会收到通知)。

不幸的是,这可能是The XY Problem的一个案例。您有问题,并且您相信 Session 解决了您的问题,但是您遇到了与 Session 不同的问题,因此您问的是如何解决您的会话问题,而不是如何解决 Session 试图解决的问题。

您要解决的真正问题是什么?

编辑:

根据您在下面的评论,您为什么不在 url 上传递客户编号:

http://website/Controller/ViewRecord/3

public ActionResult ViewRecord(int id) 
{ 
    // do whatever you need to do with the customer ID
} 
于 2012-04-10T15:46:55.020 回答