asp.net - net - Propagación del parámetro QueryString en llamadas RedirectToAction
redirecttoaction mvc example (3)
Quiero asegurarme de que un parámetro particular en el QueryString, 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, la First
devolución de datos tenía un parámetro en el QueryString
, que me gustaría pasar a la Second
acción. Una forma de hacerlo sería pasar el valor en la propia 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 la lógica de propagación de ID de solicitud 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 a QueryString desde un ActionFilter. ¿Algunas ideas?
Aquí hay un blogpost que escribí sobre cómo agregar con fluidez parámetros de cadena de consulta en la acción
Si lo necesita en una acción posterior, agréguelo a param en Session o TempData (pero necesita volver a asignar en cada acción) para que no tenga que pasarlo como una cadena de consulta en cada acción. En el caso de una sesión, una vez que haya terminado con todas las acciones, elimine esa clave de la sesión.
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 entonces:
[HttpPost]
[PreserveQueryString]
public ActionResult First()
{
////////////////////
// Lots of code ...
////////////////////
return RedirectToAction("Second");
}