2

我有一个 MVC4 网站,它需要具有高度动态数据的级联下拉菜单。我使用在线教程和许多堆栈交换问题来构建查询和 JavaScript 函数。

我正在使用的版本是 VisualStudio 2012、jquery 2.0.1、knockout 2.2.1、dot net 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));
    });

}

(从 dotnet 专家指南教程中为我的变量复制和修改)

返回 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 专家指南复制并针对我的变量进行了修改)

通过 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"}]}        

(来自两个单独的电话)

子下拉列表:

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

我做错了什么,我该如何解决?我花了两天时间试图追查这个问题,但我完全不知所措。

4

1 回答 1

1

根据您的示例 JSON data,您的回调中的变量$.getJSON不直接包含您的数组,而是包装在一个对象中,其中该"DataID"属性包含您的实际元素数组。

所以在你的$.getJSON使用data.DataID中,而不是data

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