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)
这样做还有其他选择吗?在这种情况下,最佳做法是什么?
如果它在一个控制器中,你可以这样做:
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)
但是,显然,这应该重定向到不受覆盖影响的控制器中的操作,否则您将进行循环重定向。:)
首先,您应该重定向到主页,而不是返回主页视图,否则您会遇到奇怪的情况,尽管网址在其他地方,但主页仍然显示。
其次,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)