有关HttpContext,HttpContextBase和Action Filters的问题

时间:2011-03-20 03:47:22

标签: asp.net-mvc asp.net-mvc-3 httpcontext action-filter

我尝试在静态类上构建一个静态属性,它基本上会返回一个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不可用。现在,我必须有一个单独的静态方法来从我传入的过滤器上下文中提取cookie,这看起来很尴尬。

构建这样一个静态方法来检索这样的cookie值的最佳解决方案是什么,它可以同时适用于控制器操作和动作过滤器?或者有更好的方法来做这样的事情吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

对静态HttpContext.Current的调用不是好设计。而是创建一个扩展方法,以便从HttpContextHttpContextBase的实例访问Cookie。

我为你写了一个小帮手。您可以使用它在动作过滤器中执行您的功能。

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 :(得分:1)

正如JohnnyO上面所指出的那样,我一直在动作过滤器中访问HttpContext。至少,在需要这种情况的特定动作过滤方法中。可能有一些其他过滤器/方法在某一点上没有访问权限,但是现在,这是我需要的。