从ActionFilter向QueryString添加参数

时间:2012-03-27 04:17:12

标签: asp.net asp.net-mvc-3 asp.net-mvc-routing action-filter

我正在尝试编写一个自定义ActionFilter,如果它还没有请求ID,它会向QueryString添加一个请求ID。

这样的事情:

    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添加参数? (请注意,我的目标是实现重写网址的ActionFitler,因此我必须传递QueryString中的参数。

1 个答案:

答案 0 :(得分:1)

我相信当路由引擎参与时,您将无法重写URL。路由并没有真正起作用。

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