web-dev-qa-db-ja.com

select2とajaxpostメソッド

私はajaxロードで select2 を使おうとしています。

これが私のコードです:

clonedTemplate.find('[id^=detailsPhaseFinanceMinor_]').select2({
    placeholder: "Select",
    minimumInputLength: 1,
    ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        url: "mapBasic.aspx/GetFinSys",
        dataType: 'json',
        data: function (term, page) {
            return "{'term':\"" + term + "\"}";
        },
        results: function (data, page) { // parse the results into the format expected by Select2.
            // since we are using custom formatting functions we do not need to alter remote JSON data
            return { results: data.Value };
        }
    }
});

Ajax呼び出しは、同じページのコードビハインドのwebmethod/pagemethodに対するものです。

[WebMethod]
    public static List<LookupCodeItem> GetFinSys(string term)
    {
        string stringToCompareTo = term.ToLower();

        List<LookupCodeItem> result = new List<LookupCodeItem>();


        // FIN SYS
        using (mapEntities db = new mapEntities())
        {
            List<MPO_FINSYS_AMT> finSysCodes = (from x in db.MPO_FINSYS_AMT
                                                select x).ToList();

            foreach (MPO_FINSYS_AMT item in finSysCodes)
            {
                string valKey = string.Format("{0}.{1}.{2}", item.FY, item.MDOT_MPO_CD, item.FIN_SYS);
                LookupCodeItem x = new LookupCodeItem();
                x.Value = valKey;
                x.ShortDescription = string.Format("{0}.{1}.{2}", item.FY, item.MDOT_MPO_CD, item.FIN_SYS); ;
                x.LongDescription = string.Empty;
                result.Add(x);

            }
        }

        return result;
    }

テキストボックスにデータを入力すると、POSTリクエストが行われ、jsonの送信が適切にフォーマットされているように見えます。

ただし、pagemethodからの応答はhtmlページ全体です。これは、ajax呼び出しで「contentType」が適切に設定されていない場合にpostメソッドで発生する可能性があることを理解しています。ページ上で機能する他のすべてのajax呼び出しと同じように設定しました(select2を使用していません)。

Select2は「contentType」属性を無視しますか?それとも私が間違ってしたことは他にありますか?

**編集**これを投稿した後、select2のgithubサイトにこの問題がリストされているのを見つけました: 問題492-contentTypeのサポートをAjaxに追加

ContentTypeを通過させないようです。 selet2に組み込まれているajaxヘルパーをバイパスして、手動で定義した独自のヘルパーを使用できますか?

13
Amanda Kitson

私は同じ問題を抱えていました、そして以下の解決策は私のために働きます:

ajax: {
   ...
   params: { // extra parameters that will be passed to ajax
        contentType: "application/json; charset=utf-8",
   }
   ...
}
4
TechnicalKeera

投稿リクエストにCSRFトークンを追加することを忘れないでください。クライアント側ですべてを正しく実行している可能性がありますが、トークンが欠落しているため、サーバーは要求を拒否します。たとえば、PHP Laravelフレームワーク: https://laravel.com/docs/5.4/csrf#csrf-x-csrf -token 詳細については。

1
Daniel Schreij