我们可以在Kendo Grid中返回复杂的对象吗?读?

时间:2016-09-28 17:04:17

标签: kendo-ui kendo-grid

我有一个Kendo Grid,目前我们创建数据源为:

var gridDataSource = new kendo.data.DataSource({
        transport: {
            read: {
                url: '@Url.Action("GetData", "Report")',
                dataType: "json"
            }
        },
        group: [
          { field: "Name" },
        ],
        pageSize: 20,
        serverPaging: false,
        serverFiltering: false,
        sort: { field: "Date", dir: "desc" },
        schema: {
            ......
            model: {
                fields: {
                    Date: { type: "date" },
                    Name: { type: "string" },
                    Version: { type: "string" },
                    Count: { type: "number" }
                }
            }
        }
    });

它在Report中调用GetData来获取数据。返回的数据是Class ReportRow的列表,其中包含Date,Name,Version,Count。

在后端,此报告保存在DocumentDB中,GetData确实是:

public async Task<ContentResult> GetData()
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string json = string.Empty;
    try
    {
        // this json has the time stamp attribute and Rows (array, which is what the grid shows)
        json = await _reportRepository.FindDocumentByQueryStringAsync(".....");
        if (!string.IsNullOrEmpty(json))
        {
            // convert the json
            ....

            List<ReportRow> rowList = new List<ReportRow>();
            ...
            {
                // parse the json, get results
                rowList = reportResults.Rows;
            }
            ...

            string ojson = serializer.Serialize(rowList);
            return this.Content(ojson, "application/json");
        }
    }
    catch (Exception ex)
    {
        _log.LogError("...");
    }
    return this.Content(json, "application/json");
}

当我们显示报告时,我们希望显示报告的时间戳。我的想法是:我们可以在_reportRepository中创建另一个方法来返回报告时间戳,在控制器中调用它并传递给视图。但同事问道:既然我们在GetData中得到了时间戳,有没有办法可以使用它,这样我们就不必更改_reportRepository并再打一次电话了?

所以,我的问题是:如果在GetData中,我们将json直接传递给Kendo网格,我应该如何在gridDataSource中进行更改?我们如何在模式中定义模型?或者,剑道中的模型必须是简单类型,即字符串,数字,日期,......?如果我们可以这样做,我应该在读取事件中更改什么?

我搜索过,但找不到答案。

由于

1 个答案:

答案 0 :(得分:2)

我的理解是服务器的响应中会有单个时间戳信息,即这些信息不会显示在每个网格行中。在这种情况下,您的方案将需要使用schema.data,并且类似于此处的第二个示例:

http://docs.telerik.com/kendo-ui/framework/datasource/crud#read-remote

服务器响应如下所示:

{
    "yourTimeStamp": "foo",
    "itemCount": 10,
    "items": [{
        "ProductID": 1,
        "ProductName": "Bananas"
    },{
        "ProductID": 2,
        "ProductName": "Pijamas"
    }]
}

dataSource配置应如下所示(请注意schema.data部分):

var dataSource = new kendo.data.DataSource({
    transport: {
        read: {
            url: "url"
        }
    },
    schema: {
        data: "items",
        total: "itemCount"
    }
});

最后一项任务是提取时间戳信息,因为它将在网格行之外使用。这可以通过以下几种方式完成:

另外,Grid数据项还可以包含具有嵌套字段的对象,如下所示:

http://demos.telerik.com/kendo-ui/grid/editing-custom

(类别字段)