ASP.MVC过滤器,通过谷歌分析utm查询字符串参数



我试图建立一个过滤器,当应用时通过"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);
        }
    }
}

我可以看到routeValues在调试时被正确填充,但utm参数没有包含在结果url中。

这是带有过滤器的动作:

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

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

[AllowAnonymous]
[Route("konto/registrera/tack")]
public ActionResult RegisterThanks(RegisterThanksViewModel model)
{

我猜路由有问题?

好了,我算出来了。替换onresultperformed中的Result已经太晚了。下面是我最后写的:

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);
            }
        }
    }

最新更新