我尝试在静态类上构建一个静态属性,它基本上会返回一个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值的最佳解决方案是什么,它可以同时适用于控制器操作和动作过滤器?或者有更好的方法来做这样的事情吗?
提前致谢。
答案 0 :(得分:2)
对静态HttpContext.Current
的调用不是好设计。而是创建一个扩展方法,以便从HttpContext
和HttpContextBase
的实例访问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。至少,在需要这种情况的特定动作过滤方法中。可能有一些其他过滤器/方法在某一点上没有访问权限,但是现在,这是我需要的。