Asp.net mvc 从.Read()返回元数据并在剑道网格中使用

Asp.net mvc 从.Read()返回元数据并在剑道网格中使用,asp.net-mvc,kendo-ui,kendo-ui-grid,Asp.net Mvc,Kendo Ui,Kendo Ui Grid,我正在使用带有asp.NETMVC的网格。目前网格正在使用.DataSource(c=>c.Read())调用一个URL,该URL返回一个进入网格的IEnumerable 我想在网格中实现分页。但是,数据没有正常的分页方法(计数、页码等) 相反,当我在内部检索数据时,我会按如下方式取回数据: {items:[…],下一页:'J23jeg9e93',上一页:'OKOW0R93285'} 要获取下一页,必须再次请求数据,但要包含下一页或上一页的分页令牌 目前我只将items数组返回到网格,因此没有n

我正在使用带有asp.NETMVC的网格。目前网格正在使用
.DataSource(c=>c.Read())
调用一个URL,该URL返回一个进入网格的
IEnumerable

我想在网格中实现分页。但是,数据没有正常的分页方法(计数、页码等)

相反,当我在内部检索数据时,我会按如下方式取回数据:

{items:[…],下一页:'J23jeg9e93',上一页:'OKOW0R93285'}

要获取下一页,必须再次请求数据,但要包含下一页或上一页的分页令牌

目前我只将items数组返回到网格,因此没有nextPage/previousPage元数据

我看不到任何包含此元数据的方法,因为我只是返回一个IEnumerable项,因此没有包装器对象来放入元数据


我可以使用
.Data()
将元数据附加到读取请求,但我需要使用另一种方法。一旦我拿回元数据,我需要能够将其存储在javascript变量中,以便我可以将其发送到
.Data()

我不知道您实际上是如何触发下一页、上一页操作的,但是

您可以使用MVC自定义数据源配置来提供对更多选项(如模式配置)的访问。

模式配置允许您添加可采用自定义结果格式的解析函数:

{ items: [. . . ], nextPage: 'J23jeg9e93', previousPage: 'oqow0r93285' }
并提取项目(提供给网格)和下一页、上一页值(供存储以传递给下一个读取请求)

例如:

示例网格:

@(Html.Kendo().Grid<TelerikMvcApp4.Models.GridViewModel>()
.Name("grid")
.DataSource(ds => ds
    .Custom()
    .Batch(true)
    .Schema(schema => schema
        .Parse(@<text>parseData</text>)
    )
    .Transport(transport => transport
        .Read(read => read.Action("Grid_Read", "Home").Type(HttpVerbs.Post).Data("readData"))
    )
    .PageSize(1)
    .ServerPaging(true)
)
.Pageable()
)
@(Html.Kendo().Grid())
.名称(“网格”)
.DataSource(ds=>ds
.Custom()
.Batch(真)
.Schema(Schema=>Schema
.Parse(@parseData)
)
.运输(运输=>运输
.Read(Read=>Read.Action(“Grid_Read”,“Home”).Type(HttpVerbs.Post.Data(“readData”))
)
.页面大小(1)
.ServerPaging(真)
)
.Pageable()
)
parseData和readData javascript示例:

<script>
var nextPage,
    previousPage;
function readData() {
    // Return the "extra" data that should be posted with each grid read request, which is the nextPage/previousPage we were given in the previous request respsonse.
    return {
        nextPage: nextPage,
        previousPage: previousPage
    };
}
function parseData(data) {
    // Parse the response from the server as it isn't in the typical format expected by the grid.

    // Extract your nextPage/previousPage, store it somewhere so they can be added to the next grid request.
    nextPage = data.nextPage;
    previousPage = data.previousPage;

    // Return the actual data that should be displayed in the grid.
    return data.items;
}
</script>

var下一页,
上一页;
函数readData(){
//返回应随每个网格读取请求一起发布的“额外”数据,这是我们在上一个请求响应中给出的下一页/上一页。
返回{
下一页:下一页,
上一页:上一页
};
}
函数解析数据(数据){
//解析来自服务器的响应,因为它不是网格所期望的典型格式。
//提取下一页/上一页,将其存储在某个位置,以便将其添加到下一个网格请求中。
下一页=data.nextPage;
previousPage=data.previousPage;
//返回应在网格中显示的实际数据。
返回数据项;
}
网格读取操作示例:

[HttpPost]
    public ActionResult Grid_Read([DataSourceRequest] DataSourceRequest request, string nextPage, string previousPage)
    {

        // "Fetch" the data, presumably doing something with nextPage and previousPage...
        var items = new List<GridViewModel>()
        {
            new GridViewModel() { name = "bob", age = 23},
            new GridViewModel() { name = "jim", age = 43},
        };
        // Determine what the new nextPage, previousPage should be...
        var newNextPage = "J23jeg9e93";
        var newPreviousPage = "oqow0r93285";

        return Json(new
        {
            items = items,
            nextPage = newNextPage,
            previousPage = newPreviousPage
        });
    }
[HttpPost]
公共操作结果网格读取([DataSourceRequest]DataSourceRequest请求,字符串下一页,字符串上一页)
{
//“获取”数据,大概是对下一页和上一页做了些什么。。。
var items=新列表()
{
新的GridViewModel(){name=“bob”,age=23},
新的GridViewModel(){name=“jim”,年龄=43},
};
//确定新的下一页、上一页应该是什么。。。
var newNextPage=“J23jeg9e93”;
var newPreviousPage=“oqow0r93285”;
返回Json(新的
{
项目=项目,
下一页=新下一页,
previousPage=新建previousPage
});
}

这不是一个完整、健壮的解决方案,但我认为它是可行的,至少可以为您指明一个可能的方向。

在剑道解析数据之前,您需要在数据的某个地方添加
nextPage
previousPage
信息。
Read()
命令返回的数据类似于
[{name:'bob',age:23},{姓名:'jim',年龄:43}…]
进入网格。但我需要在下一页和上一页标记中包含元数据。但我不能包含它,因为我只返回一个列表。不幸的是,idk非常适合Kendo Asp.net framework,但在Javascript中,我相信有两种可能的方法可以做到这一点:在
数据源.schema.parse
事件中添加元数据;or在
dataSource.transport.read
事件中,您可以使用一个函数发出自己的请求并将数据传递给小部件。您可以在那里添加元数据。但我不确定是否可以在Kendo Asp.Net中完成。我相信这是可能的。这看起来正是我想要做的。我也不确定如何解决下一个问题/以前的按钮,但我应该能够找到它。我现在要尝试一下。出现了一个问题,即在第一次填充网格时,将我的pageToken包含在读取请求中的.Data方法运行一次,然后再也不会运行-因此发送的值始终是初始值(空字符串)。我正在用
$('#messagesgrid').data('kendoGrid').dataSource.read();$('#messagesgrid').data('kendoGrid').refresh();
Hmmm刷新网格。我刚刚在示例项目中添加了一个按钮来触发.dataSource.read()它每次都在执行readData并点击我的Grid_Read操作,所以我真的不知道…您是否使用了与上面完全相同的行来读取和刷新?它第一次(而且只有第一次)起作用,因为“readData()”是一个函数调用,在网格初始化期间立即执行,而“readData”是一个函数“指针”(或者不管JS术语是什么),而不是调用,它设置每次执行的配置。函数调用不同于函数。