我有一些我想在网址中普遍受到关注的变量。如果它们设置在网址中,我想设置一个cookie来存储这些信息。
例如......
http://www.website.com/?SomeVariable=something
和
http://www.website.com/SomeController/SomeAction?SomeVariable=something
在这两种情况下,我都希望SomeVariable
得到回应(我希望在整个网站上的任何控制器/行动中都这样做。
我已经在主页上制作了cookie的一部分并且正在运行,但是我现在想要将人们放在主页之外的某些网址上,并且不希望在这种情况发生变化时不必重做逻辑。
可以这样做吗?我应该把代码放在哪里?
答案 0 :(得分:2)
创建自定义操作过滤器,然后查找请求变量并在其中设置Cookie。
请参阅http://msdn.microsoft.com/en-us/library/dd410056(v=vs.90).aspx
答案 1 :(得分:2)
创建一个自定义控制器,用于读取变量,如
public class BaseController:Controller
{
protected override void ExecuteCore()
{
var somevar = HttpContext.Request.QueryString["SomveVariable"];
.
.
.
base.ExecuteCore();
}
}
然后从此自定义控制器派生所有控制器。
答案 2 :(得分:2)
好的,我最终根据Matt Tew和user850010的信息搞清楚我需要做什么。
自定义操作过滤器:
public class CheckForAd : ActionFilterAttribute {
public override void OnActionExecuted( ActionExecutedContext filterContext ) {
var data = filterContext.HttpContext.Request.QueryString["AdName"];
if( data != null ) {
HttpCookie aCookie = new HttpCookie( "Url-Referrer" );
aCookie.Value = data;
aCookie.Expires = DateTime.Now.AddDays( 2 );
filterContext.HttpContext.Response.Cookies.Add( aCookie );
}
base.OnActionExecuted( filterContext );
}
}
我使用自定义操作过滤器后,我可以转到Global.asax
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
...
filters.Add( new CheckForAd() );
}
这允许我从任何动作/控制器设置cookie,而不需要我装饰动作/控制器。这也不需要我的控制器从标准Controller
以外的任何东西派生(我不想忘记这个,然后在需要时没有设置cookie)。