如果任何操作中存在变量,请设置cookie

时间:2012-09-01 08:17:48

标签: c# asp.net-mvc-3 arguments

我有一些我想在网址中普遍受到关注的变量。如果它们设置在网址中,我想设置一个cookie来存储这些信息。

例如......

http://www.website.com/?SomeVariable=something

http://www.website.com/SomeController/SomeAction?SomeVariable=something

在这两种情况下,我都希望SomeVariable得到回应(我希望在整个网站上的任何控制器/行动中都这样做。

我已经在主页上制作了cookie的一部分并且正在运行,但是我现在想要将人们放在主页之外的某些网址上,并且不希望在这种情况发生变化时不必重做逻辑。

可以这样做吗?我应该把代码放在哪里?

3 个答案:

答案 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)。