C# 使用Knockoutjs绑定对象列表

C# 使用Knockoutjs绑定对象列表,c#,asp.net,knockout.js,webforms,knockout-mapping-plugin,C#,Asp.net,Knockout.js,Webforms,Knockout Mapping Plugin,我正在尝试使用和将数据绑定到ASP.NET Webforms应用程序 HTML <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <script src="Scripts/knockout-2.3.0.js" type="text/javascript"></script> <script src="Scripts/knockout.mappi

我正在尝试使用和将数据绑定到ASP.NET Webforms应用程序

HTML

<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="Scripts/knockout-2.3.0.js" type="text/javascript"></script>
<script src="Scripts/knockout.mapping-latest.js" type="text/javascript"></script>
<script type="text/javascript">

    function bindModel(data) {
        var viewModel;
        viewModel = ko.mapping.fromJS(data);
        console.log(viewModel);
        ko.applyBindings(viewModel);
    }

    $(document).ready(function () {
        $.ajax({
            url: "TestPage.aspx/GetItems",
            data: {},
            type: "POST",
            contentType: "application/json",
            dataType: "JSON",
            timeout: 10000,
            success: function (result) {
                bindModel(result);
            },
            error: function (xhr, status) {
                alert(status + " - " + xhr.responseText);
            }
        });
    });
</script>
...
<table>
    <thead>
        <tr>
            <th>
                Id
            </th>
            <th>
                Name
            </th>
        </tr>
    </thead>
    <tbody data-bind="foreach: Item">
        <tr>
            <td data-bind="text: Id">
            </td>
            <td data-bind="text: Name">
            </td>
        </tr>
    </tbody>
</table>
但这是一个错误

Uncaught ReferenceError: Unable to parse bindings.
Bindings value: foreach: Item
Message: Item is not defined
我做错了什么,怎么解决


编辑: 如果我直接用数据调用
bindModel
,比如

bindModel({ "d": [{ "__type": "KnockoutWebFormsTest.Item", "Id": 21, "Name": "Item1", "Description": "Item 1 Description" }, { "__type": "KnockoutWebFormsTest.Item", "Id": 2, "Name": "Item2", "Description": "Item 2 Description"}] });
并将
data bind=“foreach:Item”
更改为
data bind=“foreach:d”
(由david.s建议)

它很好用。。。但如果我将JSON结果直接传递给bindModel,它会给出错误

d is not defined

知道如何解决此问题吗?

只是猜测,但您没有传递要绑定的数组。 您正在传递json对象<代码>{d:[{foo:bar},{foo:bar},]}

您可以更改此行
bindModel(结果)
bindModel(结果d)
以访问“d”包含的数组

我已经创建了一个JSBin。。


ajax调用已被删除,但您明白了重点。

只是猜测,但您没有传递要绑定的数组。 您正在传递json对象<代码>{d:[{foo:bar},{foo:bar},]}

您可以更改此行
bindModel(结果)
bindModel(结果d)
以访问“d”包含的数组

我已经创建了一个JSBin。。


ajax调用已被删除,但您明白了重点。

从您的JSON响应
{“d”:[…]}
我可以看到该数组被称为
d
。因此,您的绑定应该是
foreach:d

从您的JSON响应
{“d”:[…]}
我可以看到该数组被称为
d
。所以你的绑定应该是
foreach:d

谢谢你的回答和帮助

终于成功了

通过将
data bind=“foreach:Item”
更改为
data bind=“foreach:d”
(如david.s所建议)


viewModel=ko.mapping.fromJS(数据)
to
viewModel=ko.mapping.fromJSON(数据)

感谢所有的答案和帮助

终于成功了

通过将
data bind=“foreach:Item”
更改为
data bind=“foreach:d”
(如david.s所建议)


viewModel=ko.mapping.fromJS(数据)
to
viewModel=ko.mapping.fromJSON(数据)

很抱歉,我将其从注释移动到了建议答案。很抱歉,我将其从注释移动到了建议答案。您所说的“您没有传递要绑定的数组”是什么意思?您所说的“您没有传递要绑定的数组”是什么意思如果你从某人的帖子中得到答案,那么他们应该得到被接受的答案。如果你从某人的帖子中得到答案,那么他们应该得到被接受的答案。
bindModel({ "d": [{ "__type": "KnockoutWebFormsTest.Item", "Id": 21, "Name": "Item1", "Description": "Item 1 Description" }, { "__type": "KnockoutWebFormsTest.Item", "Id": 2, "Name": "Item2", "Description": "Item 2 Description"}] });
d is not defined