在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),但我无法找到如何覆盖或动态添加该对象。
答案 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();