Распространение параметра QueryString в вызовах RedirectToAction
Я хочу убедиться, что конкретный параметр в QueryString, в моем случае request_id
распространяется на перенаправленное действие.
Скажем, например, у меня есть Action First
,
[HttpPost]
public ActionResult First()
{
////////////////////
// Lots of code ...
////////////////////
return RedirectToAction("Second");
}
Теперь скажем, что postback First
имел параметр в QueryString
, который я хотел бы передать в действие Second
. Один из способов сделать это - передать значение в самом вызове RedirectToAction
,
string requestId = Request.QueryString[REQUEST_ID_KEY];
return RedirectToAction("Second", new { REQUEST_ID_KEY = requestId });
Но я должен сделать это в серии действий, и я не желаю включать логику распространения идентификатора запроса внутри действия. Было бы лучше, если бы я мог включить это внутри ActionFilter
, но я не могу понять, как добавить параметры в QueryString из ActionFilter. Любые идеи?
Ответы
Ответ 1
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]);
}
}
}
}
а затем:
[HttpPost]
[PreserveQueryString]
public ActionResult First()
{
////////////////////
// Lots of code ...
////////////////////
return RedirectToAction("Second");
}
Ответ 2
Если вам это нужно в последующих действиях, то, пожалуйста, добавьте этот параметр в Session или TempData (но вам нужно назначить повторное назначение в каждом действии), поэтому вам не нужно передавать его в качестве запроса в каждом действии. В случае сеанса, как только вы сделали все действия, чем удалить этот ключ из сеанса.
Ответ 3
Вот блог, который я написал о том, как свободно добавить параметры запроса в действие