2015-02-12 2 views
0

Я пытаюсь установить сеанс внутри абстрактного класса, который уже написан. Я пытаюсь это сделать; Сначала я пытаюсь проверить тип метода либо получить, либо отправить. Если это метод GET, установите сеанс.HttpContext имеет значение null в абстрактном классе

вот код:

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 значение равно нулю.

Прямо сейчас есть только один контроллер MVC, который простирается от абстрактного контроллера.

+2

Когда и откуда он называется? –

+0

Ничего не называют этим методом. Другой контроллер просто простирается от него. – Capri82

+0

Да, и этот диспетчер контроллера называет его базовым конструктором. Но когда этот контроллер инициализируется и откуда? Сказав это, я не знаком с MVC. Но, очевидно, в этот момент нет текущих «HttpContext» или «HttpContext.Request». Используйте отладчик, установите точку останова в первой строке конструктора. –

ответ

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; 
    } 
} 
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; 
     } 
    } 
} 

Update:

Чтобы ответить на Ваш комментарий, если вы «Попробуйте получить доступ к HttpContext в течение OnActionExecuted, тогда вы должны получить к нему доступ через контекст запроса в аргументе ActionExecutedContext следующим образом:

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

Разница заключается в том, что на этом этапе был создан экземпляр контроллера и установлено свойство базового контроллера HttpContext. В конечном итоге вся инфраструктура .NET MVC делает ссылку на статический экземпляр System.Web.HttpContext от Controller.HttpContext.

+0

Спасибо за код. Но что, если я переопределяю Execute или какую-то другую функцию, например OnActionExecuted из CONTROLLER внутри абстрактного контроллера, а затем использовать HTTPcontext и настройку сеанса? – Capri82

+0

См. Мой обновленный ответ в ответ на ваш комментарий. –

+0

Спасибо, это сработало. – Capri82

Смежные вопросы