Asp.net mvc 在asp.net MVC的POCO模型类中使用HTTPContext变量
控制器使用HttpContext请求对象获取相关信息,并将其传递给viewmodel 字符串user=HttpContext.Request.Headers[“abc”] 问题是如何将相同的信息(即HttpContext)传递给POCO模型,在POCO模型中我必须设置一些参数。我无法使用System.Web.MVCAsp.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() {
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;
}
我已经完成了您提到的服务层,但由于有很多对象需要跟踪,因此获取所需的价值变得非常困难。请详细说明您的第一个选择:使用未映射属性或函数?谢谢