2

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 でのアクション/コントローラーの配線が失われます。

4

2 に答える 2

1

UrlHelperのタイプUrl)は、現在のアクションへのアクセスに使用されたルートデータにアクセスできます。特に指定しない限り、これらの値を使用して必要なルート値を入力しようとします。

于 2012-06-15T12:58:45.057 に答える
0

is this by design?

This magic happens because of Routing infrastructure. Some people thing that the MVC routing is only about handling incoming requests but it is also about generating outgoing URLs.

The html helpers like ActionLink and the UrlHelper these all integrated with the routing module and when you try to create an outgoing URL they check the routing schema that you defined in Global.asax.cs and create the URLs accordingly.

When the schema that you defined in Global.asax.cs changes the generated URLs changes accordingly and so when you create links in your application, rely on this helpers instead of directly hardcoding them in controller or views.

于 2012-06-15T13:27:23.597 に答える