我正在尝试在已经编写的抽象类中设置会话。我想做的是; 首先,我尝试检查方法类型是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控制器从抽象控制器扩展。
答案 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;
}
}