0

我一直在阅读有关此的所有文档,但仍然无法使其正常工作。

我有一个提供 JSON 对象的 Web API。这是一个包含 22 项内容的列表。只有 22 行文字。

我想拿这些并形成一个TreeView。这 22 个字符串中的每一个都会在它们下面有项目,但我只想让第一部分工作。

我的第一个问题是,如何从 API 中提取数据并使用它填充 treeView?

在我的主页上,我有这个:

<div id="treeView"></div>

在我的 JavaScript 文件中,我有这个:

$("#treeView").kendoTreeView({
    checkboxes: true,
    dataSource: {
        transport: {
            read: {
                url: "http://...",
                dataType: "json"
            }
        }
    }
});

当我尝试运行该页面时,我得到“请求失败”。[重试]

如果我打开浏览器并转到此 URL,数据将作为 JSON 对象返回。

我在这里做错了什么?

编辑 -

返回 JSON 的代码:

public List<string> getNotificationByUser(int id)
{
      List<string> notificationTitles = new List<string>();

      foreach (var notification in notifications)
      {
          notificationTitles.Add(notification.ToString());
      }
      return notificationTitles;
}
4

2 回答 2

1

好的!我已经能够重现您的错误。问题是22 行文本不是有效的 JSON。

返回类似:

This
is
a
test

不是有效的 JSON。

但是一个有效的 JSON 是不够的,你应该返回如下内容:

[
    { "text": "This" },
    { "text": "is" },
    { "text": "a" },
    { "text": "test" }
]

即:结果应该是一个对象数组,其中每个对象都有一个text字段。

注意我知道不必调用它,text但为了简单起见,我使用它,因为它是默认值。

于 2013-07-24T19:09:21.730 回答
-1

我想出了我所有的答案:

function CreateNotificationTree(userId)
{
    debugger;
    var data = new kendo.data.HierarchicalDataSource({
        transport: {
            read: {
                url: "../api/notifications/byuserid/" + userId,
                contentType: "application/json"
            }
        },
        schema: {
            model: {
                children: "notifications"
            }
        }
    });

    $("#treeview").kendoTreeView({
        dataSource: data,
        loadOnDemand: true,
        dataUrlField: "LinksTo",
        checkboxes: {
            checkChildren: true
        },
        dataTextField: ["notificationType", "NotificationDesc"],
        select: treeviewSelect
    });

    function treeviewSelect(e)
    {
        var node = this.dataItem(e.node);
        window.open(node.NotificationLink, "_self");
    }
}

[HttpGet]
public List<Node> getNotifications(int id)
{
    var bo = new HomeBO();
    var list = bo.GetNotificationsForUser(id);
    var notificationTreeNodes = (from GBLNotifications n in list
                                 where n.NotificationCount != 0
                                 select new NotificationTreeNode(n)).ToList();
    var li = notificationTreeNodes.Select(no => new Node
    {
            notificationType = no.NotificationNode.NotificationType + " " + "(" + no.NotificationNode.NotificationCount + ")", notifications = bo.GetNotificationsForUser(id, no.NotificationNode.NotificationTypeId).Cast<GBLNotifications>().Select(item => new Notification
            {
                    ID = item.NotificationId, NotificationDesc = item.NotificationDescription, Params = new List<NotificationParam>
                    {
                            new NotificationParam
                            {
                                    ParamName = item.Param1, ParamVal = item.ParamValue1
                            },
                            new NotificationParam
                            {
                                    ParamName = item.Param2, ParamVal = item.ParamValue2
                            },
                            new NotificationParam
                            {
                                    ParamName = item.Param3, ParamVal = item.ParamValue3
                            },
                            new NotificationParam
                            {
                                    ParamName = item.Param4, ParamVal = item.ParamValue4
                            },
                            new NotificationParam
                            {
                                    ParamName = item.Param5, ParamVal = item.ParamValue5
                            },
                    },
                    ActionPageName = item.ActionPageName
            }).ToList()
    }).ToList();
    li.ForEach(i => i.notifications.ForEach(x => x.SetNotificationLink()));
    return li;
}
于 2013-08-07T00:28:32.550 回答