ASP.NET MVC:确保用户始终拥有会话变量集
考虑需要设置会话变量的ASP.NET MVC应用程序。它在整个应用程序中使用。它将通过读取浏览器cookie上的哈希值或用户登录后进行设置。ASP.NET MVC:确保用户始终拥有会话变量集
在WebForms +主页面模型中,我会检查母版页的Page_Load()。也许不是最终的事件,但它很容易找到。
你将如何检查和强制ASP.NET MVC中的会话变量的存在?考虑到这个问题可能不涉及用户登录细节,但可能包含其他一些数据(可能是第一次访问时间)。
解决方案尝试
public void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Session["SomeDateTime"] = DateTime.Now.ToString();
// results in Object reference not set to an instance of an object.
// context.Session is null
}
你有两个选择。在基本控制器的功能Initialize
假设所有的控制器从基本控制器继承
1.Place逻辑,你可以放置在基本控制器的功能Execute()
的覆盖所需的逻辑。
public class BaseController : Controller
{
public BaseController()
{
}
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
// check if the user has the value here using the requestContext.HttpContext object
}
{
2.使用在Global.asax void Application_PreRequestHandlerExecute(Object source, EventArgs e)
功能
public void Application_PreRequestHandlerExecute(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
// use an if statement to make sure the request is not for a static file (js/css/html etc.)
if(context != null && context.Session != null)
{
// use context to work the session
}
}
注:第二部分适用于任何ASP.NET应用程序的WebForms或MVC。
至于enforcing
他们有一定的会话变量,它真的很开放。您可以重定向到某个页面,以便填写表单或选择一个选项或其他内容。或者,如果找不到某个会话密钥,可能只需要设置一个默认值即可。
编辑
虽然玩这个,我注意到Application_PreRequestHandlerExecute
办法的一个大问题。该事件处理程序正在调用对服务器的任何请求,无论是.css/.js/.html文件。我不确定这是否是我的工作站设置方式的问题,或者只是ASP.NET/IIS的工作原理,所以我会确保在实现上述方法时不会在所有请求中调用此方法。
由于之前的原因,我把这项工作用if
声明包裹在会议中。
@Baddie - 感谢您的建议!不幸的是,第二个选项导致“未设置对象引用”。我已经用细节更新了这个问题。再次感谢! – 2010-04-02 14:06:16
更新了我的答案。您需要使用Application_PreRequestHandlerExecute事件而不是Application_BeginRequest,因为Session不是在那里建立的。看看我的编辑。 – Omar 2010-04-05 12:48:16
@Omar这对我有帮助,选项1.需要检查管理员状态的用户角色,并在每个操作执行前将会话或会话存储在会话中。谢谢。 – webtrifusion 2011-08-19 16:29:51
不知道我完全理解这个问题,但我通过覆盖控制器的OnActionExecuting方法来做到这一点。
在那里您可以执行代码以查看会话变量是否存在。如果没有,创建它,如果是的话就使用它。
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Session != null)
{
//TODO: Get value from session etc.
}
base.OnActionExecuting(filterContext);
}
作为另一种选择,ControllerActionInvoker类调用每个操作方法;它通过控制器工厂分配给控制器。所以你可以继承这个动作调用器,每次一个动作被调用时(通过覆盖InvokeAction方法)在这里检查这个存在......
你试过使用Application_PreRequestHandlerExecute吗? – Kiquenet 2016-06-22 10:43:39