8

在 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"];

但是,如果我想在我的模型/视图模型中检索它,我将不得不将该代码段放在任何地方,因此我想到直接在 HttpContext 中创建 CustomClass(所以我至少不必进行类型转换) ,但我无法找到如何覆盖或动态添加该对象。

4

2 回答 2

13

您可以创建一个扩展方法。像这样的东西:

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

然后你会这样称呼它:

var user = HttpContext.Current.GetUser();
于 2013-05-29T09:15:37.463 回答
6

我最近遇到了类似的问题。虽然我使用过 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();
于 2013-05-29T09:17:40.043 回答