2012-03-27 57 views
1

我正在尝试编写一个自定义ActionFilter,它会将请求ID附加到QueryString(如果它还没有)。将参数添加到来自ActionFilter的QueryString

事情是这样的:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     Controller controller = (Controller)filterContext.Controller; 
     HttpRequestBase request = filterContext.HttpContext.Request; 

     // New request 
     if (request.QueryString[REQUEST_ID_KEY] == null) 
     { 
      string requestId = Utility.GetNewUniqueId(); 
      controller.Session[REQUEST_ID_KEY] = requestId; 

      //////////////////////////////////////// 
      // Add request id to query string ...??? 
      //////////////////////////////////////// 

      return; 
     } 

    } 

一种方法来添加参数的查询字符串,我发现是动作重定向到自身与请求ID添加到路由值,如:

RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
    redirectTargetDictionary.Add("action", actionName); 
    redirectTargetDictionary.Add("controller", controllerName); 
    redirectTargetDictionary.Add(REQUEST_ID_KEY, requestId); 

    filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary); 

但这种看起来像一个黑客。有没有更好的方法将参数添加到QueryString? (请注意,我的目标是实现重写URL的ActionFitler,所以我必须通过参数QueryString)。

回答

1

我相信,在路由引擎启用之后,您将无法重新编写URL。路由并不是真的那样工作。

但是,您可以通过使用过滤器来操作用于调用操作的操作值。 Phil Haack has an article explaining this exact approach.

+0

感谢您的及时回复。为行动添加一个参数对我来说不起作用,因为我希望它可以在回发中使用。 – 2012-03-27 04:40:15