Вопросы, касающиеся HttpContext, HttpContextBase и Action Filters - PullRequest
2 голосов
/ 20 марта 2011

Я пытаюсь создать статическое свойство для статического класса, который в основном будет возвращать значение cookie, которое будет использоваться на моем сайте MVC (MVC 3, если это имеет значение).Примерно так:

public static class SharedData
{
    public static string SomeValue
    {
        get
        {
            if (HttpContext.Current.Request.Cookies["SomeValue"] == null)
            {
                CreateNewSomeValue();
            }

            return HttpContext.Current.Request.Cookies["SomeValue"].Value.ToString();
        }
    }
}

Мне нужно получить доступ к этому из действий контроллера, методов global.asax и фильтров действий.Но проблема в том, что при запуске фильтров действий HttpContext недоступен.Прямо сейчас у меня должен быть отдельный статический метод, чтобы просто извлечь куки из контекста фильтра, который я передаю, что кажется неудобным.

Каково лучшее решение для создания такого статического метода для получения кукизначение, подобное этому, которое работает как из действий контроллера, так и из фильтров действий?Или есть лучший способ сделать что-то подобное?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

Звонок на статический HttpContext.Current - это не хороший дизайн.Вместо этого создайте метод расширения для доступа к cookie из экземпляра HttpContext и HttpContextBase.

Я написал маленький помощник для вас.Вы можете использовать его для выполнения своих функций из фильтра действий.

public static class CookieHelper
{
    private const string SomeValue = "SomeValue";
    public static string get_SomeValue(this HttpContextBase httpContext)
    {
        if(httpContext.Request.Cookies[SomeValue]==null)
        {
            string value = CreateNewSomeValue();
            httpContext.set_SomeValue(value);
            return value;
        }
        return httpContext.Request.Cookies[SomeValue].Value;
    }
    public static void set_SomeValue(this HttpContextBase httpContext, string value)
    {
        var someValueCookie = new HttpCookie(SomeValue, value);
        if (httpContext.Request.Cookies.AllKeys.Contains(SR.session))
        {
            httpContext.Response.Cookies.Set(someValueCookie);
        }
        else
        {
            httpContext.Response.Cookies.Add(someValueCookie);
        }
    }   
}

Примечание. Вместо этого вы можете легко заставить эти методы работать на HttpContext, просто заменив параметр HttpContextBase на HttpContext.

1 голос
/ 21 марта 2011

Как указал выше ДжонниО, у меня всегда был доступ к HttpContext из моего фильтра действий.По крайней мере, в конкретном методе фильтра действий, где это было необходимо.Возможно, был какой-то другой фильтр / метод, который не имел доступа в какой-то момент, но сейчас это работает так, как мне нужно.

...