Добавяне на параметри към QueryString от ActionFilter

Опитвам се да напиша персонализиран 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;
        }

    }

Един от начините за добавяне на параметъра към низа на заявката, който открих, беше да пренасоча действието към себе си с идентификатора на заявката, добавен към стойностите на маршрута, като този:

  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, което пренаписва URL адреси, така че трябва да предам параметъра в QueryString).


person Arnab Chakraborty    schedule 27.03.2012    source източник
comment
Намерили ли сте някога по-добър начин от пренасочването към себе си?   -  person Ste Griffiths    schedule 01.04.2020
comment
Afaik, не можах да намеря по-добро решение.   -  person Arnab Chakraborty    schedule 02.04.2020


Отговори (1)


Вярвам, че докато системата за маршрутизиране е включена, няма да можете да пренаписвате URL адреси. Маршрутизирането всъщност не работи по този начин.

Можете обаче да манипулирате стойностите на действие, които се използват за извикване на действие, като използвате филтър. Фил Хаак има статия, обясняваща точно този подход.

person Josh    schedule 27.03.2012
comment
Благодаря за бързия отговор. Добавянето на параметър към действието няма да работи за мен, тъй като бих искал той да бъде наличен и в публикацията обратно. - person Arnab Chakraborty; 27.03.2012