在Knockout foreach Databinding中使用服务器端对象类型

时间:2013-08-12 04:34:17

标签: c# asp.net json knockout.js

我从ASP.NET Web方法获得此JSON响应

  

{ “d”:[{ “__类型”: “KnockoutWebFormsTest.Item”, “ID”:1, “名称”: “项目1”, “描述”:“项目   1   描述 “},{” __类型 “:” KnockoutWebFormsTest.Item “ ”ID“:2, ”名称“: ”项目2“, ”说明“:” 项目   2描述“}]}

然后使用 KnockoutJS 我可以使用此代码绑定数据

的Javascript

function bindModel(data) {
    var viewModel;
    viewModel = ko.mapping.fromJSON(data);
    ko.applyBindings(viewModel);
  }

HTML

<tbody data-bind="foreach: d">
    <tr>
        <td data-bind="text: Id"></td>
        <td data-bind="text: Name"></td>
    </tr>
</tbody>

这在d循环中使用foreach的对象类型,但现在需要在foreach循环中使用我的服务器对象类型Item

<tbody data-bind="foreach: Item">

我怎样才能做到这一点?

注意:这与我在SO

中的上一个问题有关

编辑1:

服务器端代码(C#)

[WebMethod]
public static List<Item> GetItems()
{
    List<Item> itemlist = new List<Item>
    {
        new Item {Id = 1, Name = "Item1", Description = "Item 1 Description"},
        new Item {Id = 2, Name = "Item2", Description = "Item 2 Description"}
    };

    return itemlist;
}

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

编辑2:

来自此Javascript代码

var jsonObject;
jsonObject = ko.mapping.fromJSON(data);
console.log(data);
console.log(jsonObject);
console.log(jsonObject.d);

我得到了

数据

  

{“d”:[{“__ type”:“KnockoutWebFormsTest.Item”,“Id”:1,“Name”:“Item1”,“Description”:“Item 1   描述“},{”__ type“:”KnockoutWebFormsTest.Item“,”Id“:2,”Name“:”Item2“,”Description“:”Item 2 Description“}]}

的JSONObject

>Object {d: function, __ko_mapping__: Object}
 >__ko_mapping__: Object
 >d: Object[0]
 >__proto__: Object

jsonObject.d

  

[]

2 个答案:

答案 0 :(得分:1)

你无法改变我所看到的默认行为..因为这是一个WebMethod,它返回JSON - 从.NET 3.5起,有一个重大变化来添加一个返回有效负载的d属性。

见这里:http://encosia.com/a-breaking-change-between-versions-of-aspnet-ajax/

具体做法是:

So the wrapping of the "d" parameter prevents direct execution of the string as script. No Object or Array constructor worries.

你可以做什么,将其分配到其他地方,如下:

var jsonObject;
jsonObject = ko.mapping.fromJSON(data);
var viewModel = { Item: jsonObject.d };
ko.applyBindings(viewModel);

这将允许您设置绑定:

<tbody data-bind="foreach: Item">

答案 1 :(得分:0)

您应该更改数据并按照以下方式构建:

Data = [d:[{
Id: "1",
Name: "Saeed",
LastName: "SWD",
Description: "ok",
Items:[{ Id: "1", Description: "ok"},
       { Id: "1", Description: "ok"}]
}]];

然后您就可以访问以下项目了:

<table data-bind="foreach: d">
    <tbody data-bind="foreach: Items">