MVCアクションへのjquery投稿を行っています。アクションは、(たとえば) Id = 123 の json 結果を返します。コードはまだ初期段階ですが、Url.Action("action", "controller") が完全な URL を構築していることを知って非常に驚きました。 id Json から返されました。これは魔法ですか?それができるというドキュメントは見つかりませんでした。
// how I assumed it would need to be accomplished
// redirects to "Controler/Action/123123" where data = { id = 123 }
$.post(saveUrl, json, function (data) {
var detailsUrl = "@Url.Action("Action", "Control")" + data.id;
window.location = detailsUrl;
});
// rewritten without adding id to the route, not sure how this works...
// redirects to "Controler/Action/123" where data = { id = 123 }
$.post(saveUrl, json, function (data) {
var detailsUrl = "@Url.Action("Action", "Control")";
window.location = detailsUrl;
});
参考までに、アクションは次のとおりです。
[HttpPost]
public ActionResult Save(Model model)
{
return new JsonResult { Data = new { id = 123 }};
}
だから私の質問は、これは仕様によるものですか?何を使用するかをどのように知るのですか?
回答で指摘されているように、Url.Action は既存のルート値にアクセスでき、それらを再利用しようとします。これを回避するために、以下の少しハックなソリューションを使用しました。
var detailsUrl = "@Url.Action("Action", "Control", new { id = ""})" + "/" + data.id;
これによりルート値がクリアされ、クライアント側で新しい値をアタッチできるようになります。残念ながら、null または new {} を RouteValues として Url.Action に渡しても、これは解決されません。ルート値がアタッチされないことを保証する別の Action ヘルパーを作成することは、より適切なアプローチかもしれません。または、Url.Content もありますが、これを行うと、IDE でのアクション/コントローラーの配線が失われます。