ASP.MVC过滤器传递了Google Analytics utm查询字符串参数

时间:2015-09-25 09:32:14

标签: c# asp.net-mvc

我试图构建一个过滤器,当应用时传递#34; utm _" querystring params

这就是我提出的:

TextBlock

我可以看到在调试时正确填充了routeValues,但是utm参数并未包含在结果网址中。

这是带过滤器的操作:

public class PassAlongParametersFilter : FilterAttribute, IResultFilter
{
    public string Filter { get; set; }

    public PassAlongParametersFilter()
    {
        Filter = "*";
    }

    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
    }

    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
        if (filterContext.Result is RedirectToRouteResult)
        {
            var action = (RedirectToRouteResult) filterContext.Result;

            var qs = filterContext.RequestContext.HttpContext.Request.QueryString;

            var regex = StringUtils.WildcardToRegex(Filter);

            var routeValues = action.RouteValues;

            qs.AllKeys.Where(e => Regex.IsMatch(e, regex)).ForEach(s => routeValues[s] = qs[s]);

            filterContext.Result = new RedirectToRouteResult(action.RouteName, routeValues, action.Permanent);
        }
    }
}

这是我尝试重定向到的操作:

[HttpPost]
[AllowAnonymous]
[PassAlongParametersFilter(Filter = "utm_*")]
[Route("konto/registrera/externt/{campaignCode}")]
public ActionResult SimpleRegisterExternal(string email, string campaignCode)
{

我猜测路由有什么东西?

1 个答案:

答案 0 :(得分:3)

好的,我明白了。替换OnResultExecuted中的结果为时已晚。这就是我最终的结果:

public class PassAlongParametersFilter : ActionFilterAttribute
    {
        public string Filter { get; set; }

        public PassAlongParametersFilter()
        {
            Filter = "*";
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.Result is RedirectToRouteResult)
            {
                var action = (RedirectToRouteResult)filterContext.Result;

                var qs = filterContext.RequestContext.HttpContext.Request.QueryString;

                var regex = StringUtils.WildcardToRegex(Filter);

                var routeValues = action.RouteValues;

                qs.AllKeys.Where(e => Regex.IsMatch(e, regex)).ForEach(s => routeValues[s] = qs[s]);

                filterContext.Result = new RedirectToRouteResult(action.RouteName, routeValues, action.Permanent);
            }
        }

    }