抽象类中的HttpContext为null

时间:2015-02-12 12:00:44

标签: c# asp.net-mvc

我正在尝试在已经编写的抽象类中设置会话。我想做的是; 首先,我尝试检查方法类型是get还是post。如果是GET方法,则设置会话。

这是代码:

public abstract class BaseAbstractController : Controller
{
    public BaseAbstractController()
    {
        if (this.HttpContext.Request.HttpMethod.ToString() == "GET")
        {
            this.HttpContext.Session["testsession"] = this.HttpContext.Request.Url.AbsolutePath;
        }
    }
}

我面临的问题是,我得到Null异常错误,因为HTTPContext值为null。

现在只有一个MVC控制器从抽象控制器扩展。

2 个答案:

答案 0 :(得分:1)

您的问题是,您引用的HttpContext内的Controller属性在控制器被实例化之后才会设置 - 这意味着它在您的抽象类的构造函数中不可用。

如果您需要访问HttpContext对象,那么您最好的选择就是直接引用静态实例:System.Web.HttpContext

public abstract class BaseAbstractController : Controller
{
    public BaseAbstractController()
    {
        if (System.Web.HttpContext.Current.Request.HttpMethod.ToString() == "GET")
        {
            System.Web.HttpContext.Current.Session["testsession"] = System.Web.HttpContext.Current.Request.Url.AbsolutePath;
        }
    }
}

<强>更新

要回复您的评论,如果您尝试访问HttpContext中的OnActionExecuted,那么您应该通过ActionExecutedContext参数中的请求上下文访问它,如下所示:

protected virtual void OnActionExecuted(ActionExecutedContext filterContext)
{
    var context = filterContext.HttpContext;
}

不同之处在于,此时控制器已实例化,并且已设置基本控制器的HttpContext属性。最终,所有.NET MVC框架都在引用System.Web.HttpContext中的Controller.HttpContext静态实例。

答案 1 :(得分:1)

最好不要在构造函数中执行此操作,因为构造函数应该只在可能的情况下构造实例。您可以改为覆盖OnActionExecuting

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    var req = filterContext.RequestContext.HttpContext.Request;
    if (req.HttpMethod == "GET")
    {
        filterContext.RequestContext.HttpContext.Session["testsession"] = req.Url;
    }
}