0

少し漠然とした質問ですが、これがどのように機能するのかわかりません。Firebug によると、私の ajax リクエストからの Json オブジェクト (配列?) は次のようになります。

{
"jsonResult":
"[
   {\"OrderInList\":1},
   {\"OrderInList\":2}
]"
}

これは $.getJSON ajax リクエストを通じて取得されます。

    $.getJSON("/Json/GetOrderSelectList?parentCategoryId=" + postData, testData, function (jsonResult) {
        $('#orderInList option').remove();

        var map = {
            "TestKey1": "TestValue1",
            "TestKey2": "TestValue2"
        };

        $.each(jsonResult, function (key, value) {
            $("#orderInList").append($("<option value=" + key + ">" + value + "</option>")
            );
        });

$.each(jsonResult) を $.each(map) に置き換えると、選択リストが正しく入力されます。そうしないと、選択リストに「未定義」と表示されます。

MVC コントローラーのこのアクションで Json をシリアル化します。

    public JsonResult GetOrderSelectList(int parentCategoryId)
    {
        var result = Session
            .QueryOver<Category>()
            .Where(x => x.Parent.Id == parentCategoryId)
            .OrderBy(x => x.OrderInList).Asc
           .List();

        var toSerialize =
            result.Select(r => new {r.OrderInList});

        var jsonResult = JsonConvert.SerializeObject(toSerialize);                             
        return Json(new
                        { jsonResult,
                        }, JsonRequestBehavior.AllowGet);

    }

問題は、アクションが応答している Json の形式にあると思いますか? どんな助けでも大歓迎です!

答えを編集する

以下の両方の回答が役に立ちました。変数 jsonResult を強く入力できなかったようです。@JBabey に、json プロパティの読み取りエラーを指摘し、$.each ステートメントで関数 (キー、値) を提案してくれてありがとう。

コントローラーの整理を手伝ってくれた@Darin Dimitrovに感謝します!

4

2 に答える 2

3

コントローラーのアクションが間違っています。内部で手動で JSON をシリアライズしてから、これを JSON の結果として返すため、二重の JSON シリアライゼーションが発生します。配列を直接返し、JSON シリアル化の配管を ASP.NET MVC フレームワークに任せることができます。

public ActionResult GetOrderSelectList(int parentCategoryId)
{
    var result = Session
        .QueryOver<Category>()
        .Where(x => x.Parent.Id == parentCategoryId)
        .OrderBy(x => x.OrderInList)
        .Asc
        .List();
    return Json(result, JsonRequestBehavior.AllowGet);
}

その後:

$.getJSON("/Json/GetOrderSelectList?parentCategoryId=" + postData, testData, function (jsonResult) {
    $('#orderInList option').remove();
    $.each(jsonResult, function () {
        $('#orderInList').append(
            $("<option value=" + this.Id + ">" + this.Value + "</option>")
        );
    });
});

this.Idここでandを使用していることに注意してthis.Valueください。これは、JSON の結果が次のようになることを前提としています。

[{"Id": 1, "Value": "some value"}, {"Id": 2, "Value": "some other value"}]

Category実際のモデルに基づいて、これらのプロパティ名を調整する必要があります。

于 2012-08-12T15:25:40.807 に答える
1

ajax によって返されたデータのプロパティをデータ自体と混同しています。$.eachこれを修正するとうまくいきます。

返されたデータは次のようになります。

{
    "jsonResult": "[
        {\"OrderInList\":1},
        {\"OrderInList\":2}
    ]"
}

これは、成功関数に渡されるオブジェクトであることを意味します。dataの代わりに呼び出しjsonResultます。

function (data) {
    ...
    $.each(data.jsonResult, function (key, value) {
        ...
    });
});

また、配列は文字列として$.each渡されるため、反復する前に解析する必要がある場合があります。

于 2012-08-12T15:25:20.463 に答える