MVC中如何使用Session?

      ASP.NET平台作为底层的框架,它提供了HttpContext.Session这个成员属性让我们可以方便地使用Session,但是在MVC中,Controller抽象类为也提供了这样一个属性,我们只要访问它就可以了(支持更好的测试性)。

  SessionStateModule是根据当前HttpHandler来决定是不是启用Session。但是现在Controller和Page是分开的, Controller又是如何使用Session的呢?要回答这个问题就要扯到路由了,简单地说:现在在MVC处理请求的时候,当前HttpHandler是 MvcHandler类的实例,它有如下定义:

public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState
{
    ...

    protected virtual IAsyncResult BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, object state);
    protected internal virtual IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state);
    protected internal virtual void EndProcessRequest(IAsyncResult asyncResult);

    protected virtual void ProcessRequest(HttpContext httpContext);
    protected internal virtual void ProcessRequest(HttpContextBase httpContext);

    IAsyncResult IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData);
    void IHttpAsyncHandler.EndProcessRequest(IAsyncResult result);
    void IHttpHandler.ProcessRequest(HttpContext httpContext);
}

因此,在Controller.Session中,它是访问的HttpContext.Session,而MvcHandler实现了IRequiresSessionState接口,所以,访问HttpContext.Session就可以获取到Session 。

在MVC中,还有一个地方也在使用Session,那就是Controller.TempData这个成员属性。通常我们可能会这样使用它:

TempData["MKey"] = "Any Message";
return RedirectToAction("MyAction");

在这种地方,这些保存到TempData的数据其实也是存放在Session中的。你可以从web.config中关闭Session,你就能看到异常了。对于这种使用方法,你仍然可以前面的替代方法,但是,还有另一种方法也能做为替代Session的方法。我们看一下Controller的一段代码:

protected virtual ITempDataProvider CreateTempDataProvider()
{
    return new SessionStateTempDataProvider();
}


SessionStateTempDataProvider内部实现:

public class SessionStateTempDataProvider : ITempDataProvider
{
    // Fields
    internal const string TempDataSessionStateKey = "__ControllerTempData";

    // Methods
    public virtual IDictionary<string, object> LoadTempData(ControllerContext controllerContext)
    {
        HttpSessionStateBase session = controllerContext.HttpContext.Session;
        if (session != null)
        {
            Dictionary<string, object> dictionary = session["__ControllerTempData"] as Dictionary<string, object>;
            if (dictionary != null)
            {
                session.Remove("__ControllerTempData");
                return dictionary;
            }
        }
        return new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
    }

    public virtual void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
        HttpSessionStateBase session = controllerContext.HttpContext.Session;
        bool flag = (values != null) && (values.Count > 0);
        if (session == null)
        {
            if (flag)
            {
                throw new InvalidOperationException(MvcResources.SessionStateTempDataProvider_SessionStateDisabled);
            }
        }
        else if (flag)
        {
            session["__ControllerTempData"] = values;
        }
        else if (session["__ControllerTempData"] != null)
        {
            session.Remove("__ControllerTempData");
        }
    }
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。