Propagación del parámetro QueryString en llamadas a RedirectToAction


Quiero asegurarme de que un parámetro particular en la cadena de consultas, en mi caso el request_id se propaga a la acción redirigida.

Digamos, por ejemplo, tengo una Acción First,

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

    return RedirectToAction("Second");
}

Ahora digamos, el postback First tenía un parámetro en el QueryString, que me gustaría pasar a la acción Second. Una forma de hacerlo sería pasar el valor en la llamada RedirectToAction,

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

Pero tengo que hacer esto en una serie de Acciones y no estoy dispuesto a incorporar request id lógica de propagación dentro de la acción. Sería mejor si pudiera incorporar esto dentro de un ActionFilter, pero no puedo averiguar cómo agregar parámetros al QueryString desde un ActionFilter. Alguna idea?

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

Y luego:

[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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-27 06:06:01

Si lo necesita en una acción posterior, por favor agréguelo ese param en Session o TempData (Pero necesita reasignarlo en cada acción) para que no necesite pasarlo como un querystring en cada acción. En caso de sesión, una vez que haya terminado con todas las acciones, elimine esa clave de la sesión.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-27 05:13:22

Aquí hay un blogpost que escribí sobre cómo agregar fluidamente parámetros de querystring en la acción

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-19 14:25:29