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?
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");
}
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.
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
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