13

現在、VS2010 で ASP.NET MVC3 アプリケーションを開発していますが、@Url.Actionヘルパーに問題があります。このヘルパーを使用する ajax リクエストがあります。

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })';
$.post(url).success(function(data) { 
    ... 
});

問題は、urlこの後の の値が であることです。ルートの値/Controller/Action?a=a&b=bの間に注意してください。&これは機能しませんが、機能する場合:

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })'.replace('amp;', '');

それは完全に動作します!!!

私の行動は次のようなものです:

public JsonResult Action(string a, string b) 
{
    ...
}

私は自分のアプリをデバッグしましたが、アクションが呼び出され、さえaありますが"a"bですnull

これは の望ましい動作Url.Actionですか? 私はそうは思わない。私を助けてください、私は何が間違っていますか? Url.Action呼び出しに別のパラメーターを追加する必要がありますか? 前もって感謝します。

4

5 に答える 5

9

ここでの問題は、剃刀構文を使用している場合です。@...剃刀エンジンは Url.Action (文字列) の結果を MvcHtmlString としてエンコードしています。これにより、アンパサンドが としてエンコードされ&ます。これを回避するには、Html.Raw(HTML エンコードされていないマークアップを返します。) を使用します。

var url = '@Html.Raw(Url.Action("Action", "Controller", new { a = "a", b = "b" }))';

結果: '/Controller/Action?a=a&b=b'

@GSerg に感謝します (Dave Alperovich の回答のコメントを参照してください)...しかし、望ましい結果は JavaScript エンコーディングではありません。HttpUtility.JavaScriptStringEncode("&")'\u0026' で結果を使用する

于 2015-10-28T20:11:07.177 に答える
3

あなたではありません。Javascriptはを保護された文字として識別し、 「それをエンコード」します

あなたはそれを回避する一つの方法を見つけました、私は他の人を見ました。この質問は最善の方法を尋ねているわけではありませんが、それがあなたであるかどうかにかかわらず、私はそれがあなたではないことを保証できます。あなたは明らかに間違ったことは何もしませんでした。これはJavascriptの自然な動作です。

最善のアプローチについて話し合っている場合は@Url.Action、URLを取得するためだけに使用し、paramsをparamsとしてJQueryメソッドに渡すことを好みます(.Ajaxメソッドが私のお気に入りです)。

e.camperから借りた例

$.post(url, { a: "a", b: "b"}).success(...)
于 2013-03-15T04:21:32.983 に答える
3

上記の回答で述べたことはすべて素晴らしいです。追加のデータを送信したい場合は、ajax リクエストの送信方法に何かを追加したいと思います。

var url = '@Url.Action("Action", "Controler")';
$.post(url,{a:'a',b:'b'}).success(function(data) { 
    ... 
});
于 2013-03-15T04:40:13.710 に答える
2

コメントで述べたように、これは JavaScript エンコーディングの問題です。UrlDecoding や文字置換を行わなくても済むようにする最善の方法は、渡そうとするパラメーターに一致するルートを定義することです。

routes.MapRoute(
            "MyCustomRoute",
            "{Controller}/{Action}/{a}/{b}",
            new {controller = "Controller", action = "Action"}

これを global.asax ファイルのデフォルト ルートの上に配置します。今、あなたが電話するとき

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })';

出力は次のようになります。/Controller/Action/a/b

于 2013-03-15T04:25:20.040 に答える
0

これは古い質問であることは知っていますが、同様の問題があったため、これを終了します。

$.ajax({
        type: "Post",
        url: "@Url.Action("Action", "Controller")",
        data:{ param1 : "@Model.param1", param2 : "@Model.param2", param3:"@Model.param3",......,param20 : "something" },
        success: function (response) {
            $("#yourDiv").html(response);
       }
    });

これが他の誰かに役立つことを願っています。

于 2014-03-08T01:36:14.323 に答える