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