2013-05-29 4 views
5

В # проекта ASP.NET MVC C:Добавить пользовательский класс HttpContext

настоящее время я использую HttpContext.Items для хранения имущества, которое должно использоваться везде в этой просьбе. Это то, что я имею в контроллере:

HttpContext.Items["IUser"] = new CustomClass(“parameter”); 

Это прекрасно работает, чтобы получить в представлении, так как я переопределение WebViewPage по умолчанию, как это в файле web.config просмотров:

<pages pageBaseType="Project.CustomWebViewPage"> 

Внутри CustomWebViewPage создать свойство и установить его в InitHelpers() метод как это:

IUser = (CustomClass)HttpContext.Current.Items["IUser"]; 

Однако, если я хочу, чтобы получить его в моих моделей/ViewModels Мне нужно будет поместить этот код кода повсюду, и поэтому я подумал о создании CustomClass непосредственно внутри HttpContext (так что мне, по крайней мере, не придется приписывать типы), но я не могу найти, как сделать переопределение или динамически добавьте к нему этот объект.

ответ

9

Вы можете создать метод расширения. Что-то вроде этого:

public static class HttpContextExtensions 
{ 
    public static CustomClass GetUser(this HttpContextBase context) 
    { 
     return (CustomClass)context.Items["IUser"]; 
    } 
} 

Тогда вы могли бы назвать это так:

var user = HttpContext.Current.GetUser(); 
5

Я недавно столкнулся с подобной проблемой. Хотя я работал с WebForms, мое решение должно также применяться к MVC.

Я создал новый объект для доступа к слоям DAL/Business Logic для каждого запроса. Это позволяет мне выполнять изменения в логике, независимо от того, сколько времени занимает запрос или если выполняется несколько запросов одновременно. Также это позволило обеспечить удаление моего объекта, когда запрос закончился.

Моя первая мысль заключалась в том, чтобы создать пользовательскую реализацию HttpContextBase, но я не смог найти способ переписать создание HttpContext для запроса.

Итак, наконец я ввел метод расширения, который инкапсулирует всю логику:

public static class HttpContextExtensions 
{ 
    public static CustomClass GetIUser(this HttpContextBase Context) 
    { 
     return Context.Items["IUser"] as CustomClass; 
    } 
} 

Теперь ваш код упрощающий на:

var user = Request.RequestContext.HttpContext.GetIUser(); 
Смежные вопросы