использование переменной HTTPContext в классе модели POCO в asp.net MVC - PullRequest
0 голосов
/ 12 марта 2012

Контроллер использует объект запроса HttpContext для получения соответствующей информации и передает ее в viewmodel.

string user = HttpContext.Request.Headers ["abc"]

Вопрос в том, как передать ту же информацию, например HttpContext, в модель 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";
        }
     }

при создании объекта HTTPContextBase с использованием HTTPContext.Current генерирует ошибку

"Запрос недоступен в текущем контексте"

любая помощь будет оценена. Спасибо

Ответы [ 2 ]

0 голосов
/ 12 марта 2012

Хотя очень неплохо не связывать свои контроллеры с HttpContext (как упоминает scott.korin), я обнаружил, что иногда это не обходится (например, при тестировании маршрутов).

Вот код, который мы используем, который основан на книге Стива Сандерсона " Pro ASP.NET MVC 3 Framework ".Обратите особое внимание на метод 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;
    }
0 голосов
/ 12 марта 2012

Подумайте об использовании в своей модели несопоставленного свойства (или функции, которая устанавливает закрытую переменную) для хранения значения любой необходимой вам информации из httpcontext.

Ваша модель не должна знать о httpcontext.Модели должны быть отделены от среды, в которой они используются.

Другая идея состоит в том, что если вам нужно выполнять бизнес-логику с использованием сервисного уровня, где у сервиса есть контекстная информация, передаваемая ему контроллером:

http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validating-with-a-service-layer-cs

...