Propagacja parametru QueryString w wywołaniach RedirectToAction

Chcę się upewnić, że konkretny parametr w QueryString, w moim przypadku request_id jest propagowany do przekierowanej akcji.

Powiedzmy na przykład, że mam Działanie First,

[HttpPost]
public ActionResult First() 
{
    ////////////////////
    // Lots of code ...
    ////////////////////

    return RedirectToAction("Second");
}

Powiedzmy, że postback miał parametr w QueryString, który chciałbym przekazać do akcji Second. Jednym ze sposobów, aby to zrobić, byłoby przekazanie wartości w wywołaniu RedirectToAction,

string requestId = Request.QueryString[REQUEST_ID_KEY];
return RedirectToAction("Second", new { REQUEST_ID_KEY = requestId });

Ale muszę to zrobić w serii działań i nie jestem skłonny do włączenia identyfikatora żądania logika propagacji wewnątrz akcji. Byłoby lepiej, gdybym mógł włączyć to wewnątrz ActionFilter, ale nie mogę dowiedzieć się, jak dodać parametry do QueryString z filtra ActionFilter. Jakieś pomysły?

Author: Arnab Chakraborty, 2012-03-27

3 answers

public class PreserveQueryStringAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var redirectResult = filterContext.Result as RedirectToRouteResult;
        if (redirectResult == null)
        {
            return;
        }

        var query = filterContext.HttpContext.Request.QueryString;
        // Remark: here you could decide if you want to propagate all
        // query string values or a particular one. In my example I am
        // propagating all query string values that are not already part of
        // the route values
        foreach (string key in query.Keys)
        {
            if (!redirectResult.RouteValues.ContainsKey(key))
            {
                redirectResult.RouteValues.Add(key, query[key]);
            }
        }
    }
}

A następnie:

[HttpPost]
[PreserveQueryString]
public ActionResult First() 
{
    ////////////////////
    // Lots of code ...
    ////////////////////

    return RedirectToAction("Second");
}
 49
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-27 06:06:01

Jeśli potrzebujesz go w kolejnej akcji, dodaj go, że param w sesji lub TempData (ale trzeba ponownie przypisać w każdej akcji), więc nie musisz przekazywać go jako querystring w każdej akcji. W przypadku sesji, po wykonaniu wszystkich działań usuń ten klucz z sesji.

 0
Author: alok_dida,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-27 05:13:22

Oto blog, który napisałem o tym, jak płynnie dodać parametry querystring w akcji

 0
Author: UBCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 14:25:29