2015-09-25 69 views
2

我试图建立一个过滤器,在应用时传阅“utm_”查询字符串PARAMSASP.MVC滤波器参数

这是我想出了:

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) 
{ 

我猜有什么东西与路由?

回答

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

    }