【问题标题】:Set cookie if a variable is present on any action如果变量存在于任何操作中,则设置 cookie
【发布时间】:2012-09-01 08:17:48
【问题描述】:

我有几个变量希望在 url 中得到普遍关注。如果它们在 url 中设置,我想设置一个 cookie 来存储这些信息。

例如...

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

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

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

我已经完成了它的 cookie 部分并在主页上运行,但我现在想将人们放在主页之外的一些 url 上,并且希望在这种情况发生变化时不必重做逻辑。

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

【问题讨论】:

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


    【解决方案1】:

    创建一个自定义操作过滤器,然后查找请求变量并在其中设置 cookie。

    http://msdn.microsoft.com/en-us/library/dd410056(v=vs.90).aspx

    【讨论】:

    • 基于此,我需要装饰我想要查找的每个动作/控制器(除非我可以在某个地方注册它以使其适用于所有内容)。这就是我想要摆脱的。我不想确保我的控制器/动作被装饰。
    【解决方案2】:

    创建一个将读取变量的自定义控制器,例如

    public class BaseController:Controller
    {
        protected override void ExecuteCore()
        {
    
          var somevar = HttpContext.Request.QueryString["SomveVariable"];
          .
          .
          .
          base.ExecuteCore();
        }
    }
    

    然后从这个自定义控制器派生所有控制器。

    【讨论】:

      【解决方案3】:

      好的,我最终根据来自 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)。

      【讨论】:

      • 是的,这就是我的意思。
      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 2022-11-24
      • 2021-05-31
      • 1970-01-01
      • 2023-01-13
      • 2021-11-28
      • 1970-01-01
      • 2012-02-23
      相关资源
      最近更新 更多