将自定义类添加到HttpContext

时间:2013-05-29 09:05:02

标签: asp.net asp.net-mvc asp.net-mvc-3

在ASP.NET MVC C#项目中:

我目前正在使用HttpContext.Items来存储应该在该请求中的任何地方使用的属性。 这就是我在控制器中所拥有的:

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

这样可以在视图中检索,因为我在视图web.config文件中覆盖了这样的默认WebViewPage:

<pages pageBaseType="Project.CustomWebViewPage">

在CustomWebViewPage中,我创建了一个属性,并在InitHelpers()方法中设置它,如下所示:

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

但是,如果我想在我的Models / ViewModels中检索它,我将不得不将代码段放在任何地方,因此我想到了直接在HttpContext中创建CustomClass(所以我至少不会to typecasting),但我无法找到如何覆盖或动态添加该对象。

2 个答案:

答案 0 :(得分:11)

您可以创建扩展方法。像这样:

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

然后你会这样称呼:

var user = HttpContext.Current.GetUser();

答案 1 :(得分:5)

我最近遇到了类似的问题。虽然我使用过WebForms,但我的解决方案也应该适用于MVC。

我创建了一个新对象来访问每个请求的DAL /业务逻辑层。这使我能够对逻辑进行更改,无论请求需要多长时间,或者是否同时执行多个请求。此外,它还允许在请求结束时确保我的对象处理。

我的第一个想法是创建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();