2

外部JSファイルにjquery関数を記述し、必要な場所にそのファイルを含めました。

jquery関数で、コントローラーからアクションメソッドを呼び出しました。今私の問題は、外部 JS からそのアクション メソッド パスを見つけることができないことです。そのようにメソッドが見つからないというエラーをスローしています。

これで、どこからでも機能する外部JSにアクションパス名を書き込む方法がわかりました

アクションメソッドの言及/呼び出しについて、次のことを試しました-

1. url: "/Employee/AutocompleteSuggestions" 


2. url: "AutocompleteSuggestions"

3. @Html.Raw(Url.Action("AutocompleteSuggestions", "Employee", new { @term = "Term", @moduleName="ModuleName"}))

かみそりの構文のため、3番目は機能しません。

この問題を解決するには?

以下のようにJSを使用しました-

       $.ajax({
                url: "AutocompleteSuggestions",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                type: "POST",
                data:
                    JSON.stringify({
                        term: request.term,
                        moduleName: "Employee"
                    }),
                success: function (data) {
                    response($.map(data, function (item) {
                        return { label: item.FullName, value: item.Id }
                    }
                    ))
                },
                error: function (xhr, ajaxOptions, thrownError) { alert(thrownError); }
            })
4

3 に答える 3

1

アクションへのパスを _Layout.cshtml のどこかに配置できます。たとえば、このような body タグに配置できます。

<body data-jsactionurl="@Url.Action("Action", "Controller")">

次に、次のように JS ファイルでこれを取得できます (jQuery):

var action = $("body").attr('data-jsactionurl');

または、次のようにします。

var action = $('body').data('jsactionurl')
于 2012-10-08T10:52:39.153 に答える
1

ここでの問題の 1 つは、おそらくグローバルを使用する必要があるということです。スクリプト攻撃に対して脆弱になる可能性があります。最も単純な実装については、私の元の回答を参照してください。

これはおそらくかなり安全だと思いますが、より良い答えを持っているかもしれないはるかに優れた Javascript の達人がそこにいます。

レイアウト/マスターでは、次のようなスクリプト ブロックを出力できます (私は Razor を使用しています)。

<script>
  function myActionMethods(){
    this.MyActionMethod = function(){
      return '@Url.Action("Action", "Controller")';
    };
  }
</script>

そして、次のようなものを使用して、その後にスクリプトを含めます。

var methods = new myActionMethods();
$.get(methods.MyActionMethod());

スクリプトでその URI を使用する必要がある場合 (ここでは jQuery Get を使用して説明しています)。

@Davidの回答に対するあなたのコメントに応えて

もちろん; Razor を使用して JS を出力できます: javascript を返す Razor ビューを起動するコントローラー アクションを記述するだけです (ただし、応答の種類を少しいじる必要があります)。ただし、これを行うと、すべてのキャッシュ/圧縮が失われます。そのスクリプトにメリットがある場合は、すべてを再度書き戻す必要があります。

于 2012-10-08T10:53:13.810 に答える
0

こんにちは、このように使用できます

url: "@Url.Content("~/City/State")"

その URL で、最初にコントローラー名、2 番目にアクション名

私のプロジェクトでは、このように使用しています

$.ajax({
            url: "@Url.Content("~/City/State")",
            dataType: 'json',
            data: { countryId: countryID },
            success: function (data) {
                alert(data);
                $("#stateID").empty();
                $("#stateID").append("<option value='0'>--Select State--</option>");
                $.each(data, function (index, optiondata) {
                    alert(optiondata.StateName);
                    $("#stateID").append("<option value='" + optiondata.ID + "'>" + optiondata.StateName + "</option>");
                });
            },
            error: function () {
                alert('Faild To Retrieve states.');
            }

        });

私はこれがあなたを助けると思う...

于 2012-10-08T11:19:31.420 に答える