MVC等效于Page_Load

Tur*_*urp 6 c# asp.net-mvc visual-studio-2010 actionresult

我有一个在我的MVC应用程序中设置的会话变量.每当该会话到期并且用户尝试刷新它们所在的页面时,该页面将抛出错误,因为该会话不再设置.

在加载视图之前,我是否可以检查会话是否已设置?也许把东西放在Global.asax文件中?

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

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

这样做还有其他选择吗?在这种情况下,最佳做法是什么?

Pat*_*iek 5

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

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    ... // do your magic
}   
Run Code Online (Sandbox Code Playgroud)

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

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Shared" }, { "action", "Home" } });
Run Code Online (Sandbox Code Playgroud)

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


Eri*_*sch 0

首先,您应该重定向到主页,而不是返回主页视图,否则您会遇到奇怪的情况,尽管网址在其他地方,但主页仍然显示。

其次,Session 永远不会为 Null,因为当旧会话过期或重置时会创建新会话。相反,您可以检查变量,如果该变量为空,则您知道该会话是新的。

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

不幸的是,这可能是XY 问题的一个例子。你有一个问题,并且你相信 Session 可以解决你的问题,但是你在 Session 中遇到了不同的问题,所以你问的是如何解决你的 Session 问题,而不是如何解决 Session 试图解决的问题。

你想用这个解决的真正问题是什么?

编辑:

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

http://website/Controller/ViewRecord/3

public ActionResult ViewRecord(int id) 
{ 
    // do whatever you need to do with the customer ID
} 
Run Code Online (Sandbox Code Playgroud)