2

非常に動的なデータを含むカスケード ドロップダウンが必要な MVC4 Web サイトがあります。オンラインのチュートリアルと多くのスタック交換の質問を使用して、クエリと JavaScript 関数を作成しました。

私が使用しているバージョンは、VisualStudio 2012、jquery 2.0.1、ノックアウト 2.2.1、ドット ネット 4.5 です。

リクエスト ヘッダーは application/json を受け入れ、レスポンスのコンテンツ タイプは application/json を返します。応答のコンテンツの長さは、返されたコンテンツ文字列の文字数と一致します。

私が今持っているのは、JSONLintが有効であると検証する JSON 文字列を返すことですが、同じ文字列を警告すると、無効な文字が表示されます。子のドロップダウンには正しい数のオプションが表示されますが、オプションが空白です。

関連コードCascader.js

        function CascadingViewModel() {
        this.DataID = ko.observableArray([]);
    }

var objVM = new CascadingViewModel();
ko.applyBindings(objVM);

function FetchData() {

    var selStepKindID = $("#StepKindID").val();
    $.getJSON("/TestStep/GetDataList/" + selStepKindID, null, function (data) {
        objVM.DataID(data);
        alert($.parseJSON(data));
    });

}

(ドットネット エキスパート ガイド チュートリアルから自分の変数用にコピーして変更しました)

Json を返すコントローラー ルーチン:

public ActionResult GetDataList(int id)
{
    var dataView = ViewToUse(Convert.ToInt32(id));
    var test = this.Json(dataView, JsonRequestBehavior.AllowGet);
    return this.Json(new { DataID = dataView }, JsonRequestBehavior.AllowGet);
}

(繰り返しますが、dotnet Expert Guide からコピーし、変数用に変更しました)

JSONLint を介して返され、検証された JSON のサンプル:

{"DataID":[{"Selected":false,"Text":"","Value":""},{"Selected":false,"Text":"1","Value":"txtUserName"},{"Selected":false,"Text":"2","Value":"txtPassword"},{"Selected":false,"Text":"3","Value":"txtClientCode"},{"Selected":false,"Text":"4","Value":"cmdLogon"},{"Selected":false,"Text":"5","Value":"cmdCancel"},{"Selected":false,"Text":"6","Value":"ForgotPassword"},{"Selected":false,"Text":"7","Value":"btnLogout"},{"Selected":false,"Text":"8","Value":"btnSearch"},{"Selected":false,"Text":"9","Value":"searchId"},{"Selected":false,"Text":"10","Value":"searchName"},{"Selected":false,"Text":"11","Value":"/reports/default.asp"},{"Selected":false,"Text":"12","Value":"You are not authorized to view this page"},{"Selected":false,"Text":"13","Value":"testFieldName"}]}

{"DataID":[{"Selected":false,"Text":"1","Value":"aname, xyzzzzzzzzz123, avalue, Supervisor"},{"Selected":false,"Text":"2","Value":"admin51, sadfgwagha51, avalue, External admin"}]}        

(2 つの別々の呼び出しから)

子ドロップダウン:

        <select id="DataID" name="DataID" data-bind="options: DataID, optionsText: 'Text', optionsValue: 'Value', optionsCaption: ' -- Please select a test step kind -- '">
        </select>

私は何を間違っていますか、どうすれば修正できますか? 私はこれを追跡するのに 2 日間を費やしましたが、完全に途方に暮れています。

4

1 に答える 1

1

サンプルの JSON に基づいてdata、コールバックの変数に$.getJSONは配列が直接含まれていませんが、"DataID"プロパティに要素の実際の配列が含まれているオブジェクト内にラップされています。

したがって、代わりに$.getJSON使用します:data.DataIDdata

$.getJSON("/TestStep/GetDataList/" + selStepKindID, null, function (data) {
        objVM.DataID(data.DataID);
    }); 
于 2013-06-13T15:16:18.060 に答える