我想确保 QueryString 中的特定参数(在我的例子中为 request_id
)被传播到重定向操作。
举例来说,我有一个操作First
,
[HttpPost]
public ActionResult First()
{
////////////////////
// Lots of code ...
////////////////////
return RedirectToAction("Second");
}
现在说,First
回发在 QueryString
中有一个参数,我想将其传递给 Second
操作。一种方法是在 RedirectToAction
调用本身中传递值,
string requestId = Request.QueryString[REQUEST_ID_KEY];
return RedirectToAction("Second", new { REQUEST_ID_KEY = requestId });
但是我必须在一系列操作中执行此操作,并且我不愿意将请求 id 传播逻辑合并到操作中。如果我可以将其合并到 ActionFilter 中,那就更好了,但我不知道如何从 ActionFilter 将参数添加到 QueryString。有什么想法吗?
最佳答案
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");
}
关于asp.net - 在 RedirectToAction 调用中传播 QueryString 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9883553/