with net mvc example asp asp.net asp.net-mvc asp.net-mvc-3 action-filter redirecttoaction

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?



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