Asp.net mvc 从.Read()返回元数据并在剑道网格中使用
我正在使用带有asp.NETMVC的网格。目前网格正在使用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
.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术语是什么),而不是调用,它设置每次执行的配置。函数调用不同于函数。