Asp.net mvc 在asp.net MVC的POCO模型类中使用HTTPContext变量

Asp.net mvc 在asp.net MVC的POCO模型类中使用HTTPContext变量,asp.net-mvc,poco,httpcontext,Asp.net Mvc,Poco,Httpcontext,控制器使用HttpContext请求对象获取相关信息,并将其传递给viewmodel 字符串user=HttpContext.Request.Headers[“abc”] 问题是如何将相同的信息(即HttpContext)传递给POCO模型,在POCO模型中我必须设置一些参数。我无法使用System.Web.MVC public class Test { public string userA; public Test() {

控制器使用HttpContext请求对象获取相关信息,并将其传递给viewmodel

字符串user=HttpContext.Request.Headers[“abc”]

问题是如何将相同的信息(即HttpContext)传递给POCO模型,在POCO模型中我必须设置一些参数。我无法使用System.Web.MVC

    public class Test
    {
        public string userA;
        public Test()
        {
            userA = "Here I want to get the user from HttpContext and set it";
        }
     }
使用HTTPContext.Current创建HTTPContextBase对象时抛出错误

“请求在当前上下文中不可用”


感谢您的帮助。请考虑在您的模型中使用未映射属性(或设置私有变量的函数)来存储您从httpcontext中需要的任何信息的值

您的模型不应该知道httpcontext。模型应该与使用它们的环境分开

另一个想法是,如果需要使用服务层执行业务逻辑,其中服务具有控制器传递给它的上下文信息:


虽然不将控制器绑定到HttpContext(正如scott.korin所提到的)是一个非常好的主意,但我发现有时无法避免(比如在测试路由时)

下面是我们使用的代码,它基于Steve Sanderson的书“”。请密切注意CreateHttpContext方法

    private void TestRouteMatch(string url, string controller, string action, object routeProperties = null, string httpMethod = "GET")
    {
        // Arrange
        RouteCollection routes = new RouteCollection();
        MvcApplication.RegisterRoutes(routes);
        // Act - process the route
        RouteData result = routes.GetRouteData(CreateHttpContext(url, httpMethod));
        // Assert
        Assert.IsNotNull(result);
        Assert.IsTrue(TestIncomingRouteResult(result, controller, action, routeProperties));
    }

    private bool TestIncomingRouteResult(RouteData routeResult, string controller, string action, object propertySet = null)
    {
        Func<object, object, bool> valCompare = (v1, v2) =>
        {
            return StringComparer.InvariantCultureIgnoreCase.Compare(v1, v2) == 0;
        };
        bool result = valCompare(routeResult.Values["controller"], controller)
        && valCompare(routeResult.Values["action"], action);
        if (propertySet != null)
        {
            PropertyInfo[] propInfo = propertySet.GetType().GetProperties();
            foreach (PropertyInfo pi in propInfo)
            {
                if (!(routeResult.Values.ContainsKey(pi.Name)
                && valCompare(routeResult.Values[pi.Name],
                pi.GetValue(propertySet, null))))
                {
                    result = false;
                    break;
                }
            }
        }
        return result;
    }

    private void TestRouteFail(string url)
    {
        // Arrange
        RouteCollection routes = new RouteCollection();
        MvcApplication.RegisterRoutes(routes);
        // Act - process the route
        RouteData result = routes.GetRouteData(CreateHttpContext(url));
        // Assert
        Assert.IsTrue(result == null || result.Route == null);
    }

    private HttpContextBase CreateHttpContext(string targetUrl = null, string httpMethod = "GET")
    {
        // create the mock request
        Mock<HttpRequestBase> mockRequest = new Mock<HttpRequestBase>();
        mockRequest.Setup(m => m.AppRelativeCurrentExecutionFilePath).Returns(targetUrl);
        mockRequest.Setup(m => m.HttpMethod).Returns(httpMethod);
        // create the mock response
        Mock<HttpResponseBase> mockResponse = new Mock<HttpResponseBase>();
        mockResponse.Setup(m => m.ApplyAppPathModifier(
        It.IsAny<string>())).Returns<string>(s => s);
        // create the mock context, using the request and response
        Mock<HttpContextBase> mockContext = new Mock<HttpContextBase>();
        mockContext.Setup(m => m.Request).Returns(mockRequest.Object);
        mockContext.Setup(m => m.Response).Returns(mockResponse.Object);
        // return the mocked context
        return mockContext.Object;
    }
private void TestRouteMatch(字符串url、字符串控制器、字符串操作、对象routeProperties=null、字符串httpMethod=“GET”)
{
//安排
RouteCollection routes=新RouteCollection();
MVCAPApplication.RegisterRoutes(路由);
//Act-处理路线
RouteData结果=routes.GetRouteData(CreateHttpContext(url,httpMethod));
//断言
Assert.IsNotNull(结果);
IsTrue(TestIncomingRouteResult(结果、控制器、操作、路由属性));
}
私有bool TestIncomingRouteResult(RouteData routeResult,字符串控制器,字符串操作,对象属性set=null)
{
Func valCompare=(v1,v2)=>
{
返回StringComparer.InvariantCultureInogoreCase.Compare(v1,v2)=0;
};
bool result=valCompare(路由结果值[“控制器”],控制器)
&&valCompare(路由结果值[“操作”],操作);
如果(propertySet!=null)
{
PropertyInfo[]propInfo=propertySet.GetType().GetProperties();
foreach(propInfo中的属性信息pi)
{
if(!(routeResult.Values.ContainsKey(pi.Name)
&&valCompare(路由结果值[pi.Name],
pi.GetValue(propertySet,null)))
{
结果=假;
打破
}
}
}
返回结果;
}
私有void TestRouteFail(字符串url)
{
//安排
RouteCollection routes=新RouteCollection();
MVCAPApplication.RegisterRoutes(路由);
//Act-处理路线
RouteData结果=routes.GetRouteData(CreateHttpContext(url));
//断言
Assert.IsTrue(result==null | | result.Route==null);
}
私有HttpContextBase CreateHttpContext(字符串targetUrl=null,字符串httpMethod=“GET”)
{
//创建模拟请求
Mock mockRequest=new Mock();
mockRequest.Setup(m=>m.AppRelativeCurrentExecutionFilePath).Returns(targetUrl);
mockRequest.Setup(m=>m.HttpMethod).Returns(HttpMethod);
//创建模拟响应
Mock mockResponse=new Mock();
mockResponse.Setup(m=>m.ApplyAppPathModifier(
返回(s=>s);
//使用请求和响应创建模拟上下文
Mock mockContext=new Mock();
Setup(m=>m.Request).Returns(mockRequest.Object);
Setup(m=>m.Response).Returns(mockResponse.Object);
//返回模拟的上下文
返回mockContext.Object;
}

我已经完成了您提到的服务层,但由于有很多对象需要跟踪,因此获取所需的价值变得非常困难。请详细说明您的第一个选择:使用未映射属性或函数?谢谢