我想确保QueryString中的一个特定参数,在我的情况下,request_id被传播到重定向的操作。
例如,我有一个行动第一,
@H_301_4@[HttpPost] public ActionResult First() { //////////////////// // Lots of code ... //////////////////// return RedirectToAction("Second"); }现在说,第一个回发在QueryString中有一个参数,我想传递给第二个动作。一种方法是传递RedirectToAction调用本身的值,
@H_301_4@string requestId = Request.QueryString[REQUEST_ID_KEY]; return RedirectToAction("Second",new { REQUEST_ID_KEY = requestId });但是我必须在一系列操作中执行此操作,我不愿意在请求ID传播逻辑中加入。如果我可以将它包含在ActionFilter中,那将会更好,但是我无法弄清楚如何从ActionFilter向QueryString添加参数。有任何想法吗?
解决方法
@H_301_4@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]);
}
}
}
}
接着:
@H_301_4@[HttpPost] [PreserveQueryString] public ActionResult First() { //////////////////// // Lots of code ... //////////////////// return RedirectToAction("Second"); }