2

選択ボックスを置き換えるためにselect2ライブラリを使用しています。Select2 ライブラリページにある例 7 を並べ替えました(ID などで下にスクロールし $("#e7").select2ます)。シリアル化された json データを返す独自の汎用ハンドラーを作成しました。

GetData.asxh ビュー : パブリック クラス GetData : IHttpHandler { public bool IsReusable { get { return false; } }

    public class RecipesList
    {
        public int total { get; set; }
        public List<TopRecipeTable> recipes { get; set; }

        public RecipesList() { }

        public RecipesList(int total, List<TopRecipeTable> recipes)
        {
            this.total = total;
            this.recipes = recipes;
        }
    }

    private string GenerateJsonSerializedObject(int languageId, string orderBy)
    {            
        RecipesList recipeList = new RecipesList(15, DBDataBase.GetTopRecipesByNumberOfRecipes(languageId, 15));
        return new JavaScriptSerializer().Serialize(recipeList);
    }

    public void ProcessRequest(HttpContext context)
    {
        int languageId;            
        bool languageParsed = int.TryParse(context.Request["languageId"], out languageId);
        string orderBy = (string)context.Request["orderBy"];

        if (languageParsed && orderBy != string.Empty)
        {enter code here
            context.Response.ContentType = "application/json";
            var jsonValue = GenerateJsonSerializedObject(languageId, orderBy);
            context.Response.Write(jsonValue);
        }
    }

このジェネリック ハンドラーは、正しい形式の json を返します (この URLで確認しました)。私の結果(json)も上記のページの例と同じです。しかし、この後jqueryはもう起動しません。

私のスクリプト:

$(document).ready(function () {
        $("#e8").select2({
            placeholder: "Search for a recipe",
            //minimumInputLength: 1,
            ajax: {                               
                url: "/Handlers/GetData.ashx",
                dataType: 'jsonp',
                data: function (term, page) {
                    return {
                        languageId: 1,
                        orderBy: "TA"
                    };
                },
                results: function (data, page) {
                    alert(data.total);
                    var more = (page * 10) < data.total; // whether or not there are more results available

                    // notice we return the value of more so Select2 knows if more results can be loaded
                    return { results: data.recipes, more: more };
                }
            },
            formatResult: movieFormatResult, // omitted for brevity, see the source of this page
            formatSelection: movieFormatSelection, // omitted for brevity, see the source of this page
            dropdownCssClass: "bigdrop", // apply css that makes the dropdown taller
            escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results
        });
    });

元の例で同じことを書こうとしalert(data.total)ましたが、うまくいきましたが、私のバージョンではうまくいきませんでした。したがって、正しいjson形式があり、jqueryは汎用ハンドラーを呼び出し、パラメーターlanguageIdも受け取りました...また、正しいjson形式を返しますが、何も返しません。ここで何かが欠けているかどうかはわかりません。これは、汎用ハンドラーでも機能する可能性があると確信しているためです。私の問題について十分な情報を提供したことを願っています。

I can also add my result in jquery .ajax error handler : 
xhr.status = 200
ajaxOptions = parsererror
horwnError = SyntaxError : invalid label
If this is any helpful information
4

1 に答える 1

0

この質問はかなり古いので、今では解決策があると確信しています...しかし:

これらの機能をすべて削除します。

formatResult: movieFormatResult formatSelection: movieFormatSelection dropdownCssClass: ... escapeMarkup:....

データをフォーマットするための関数を提供していませんか? これらはすべて、項目のカスタム ドロップダウンを作成する場合にのみ必要です。

data.recipes を返しています。これは {Text:"", Id:""} の配列である必要があるか、すぐに返されたものから構築する必要があります。

まず、非常に基本的なデータを含む非常に基本的なリストで動作するようにします...そしてそこから始めます。

さらに、それが機能するようになったら、IHttpHandler の代わりに WebApi または ServiceStack を使用してデータを処理してみてください。

于 2013-05-04T02:17:46.803 に答える