QueryStringの特定のパラメーター、私の場合はrequest_id
がリダイレクトされたアクションに伝播されることを確認したいと思います。
たとえば、アクションFirst
があります。
[HttpPost]
public ActionResult First()
{
////////////////////
// Lots of code ...
////////////////////
return RedirectToAction("Second");
}
ここで、First
ポストバックのQueryString
にパラメーターがあり、これをSecond
アクションに渡します。これを行う1つの方法は、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");
}
後続のアクションで必要な場合は、SessionまたはTempDataにそのパラメーターを追加してください(ただし、各アクションで再割り当てする必要があります)。これにより、各アクションでクエリ文字列として渡す必要がなくなります。セッションの場合、すべてのアクションを完了したら、そのキーをセッションから削除します。
これは私が流暢に書く方法について書いたブログ投稿です アクションにクエリ文字列パラメータを追加します