2

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

例如...

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

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

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

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

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

4

3 回答 3

2

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

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

于 2012-09-01T08:21:08.090 回答
2

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

public class BaseController:Controller
{
    protected override void ExecuteCore()
    {

      var somevar = HttpContext.Request.QueryString["SomveVariable"];
      .
      .
      .
      base.ExecuteCore();
    }
}

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

于 2012-09-01T08:30:54.857 回答
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)。

于 2012-09-01T08:48:22.517 回答