从 .Read() 返回元数据并在 kendo 网格中使用它
Returning metadata from .Read() and using it in a kendo grid
我正在使用带有 asp.net MVC 的网格。当前网格正在使用 .DataSource(c => c.Read())
调用 URL,returns 和进入网格的 IEnumerable<item>
。
我想在网格中实现分页。但是数据没有正常的分页方法(计数,页码等)。
相反,当我在内部检索数据时,我会像这样取回数据:
{ items: [. . . ], nextPage: 'J23jeg9e93', previousPage: 'oqow0r93285' }
要获取下一页,您必须再次请求数据,但包括下一页或上一页的分页令牌。
目前我只将项目数组返回到网格,因此没有 nextPage/previousPage 元数据。
我看不出有什么方法可以包含此元数据,因为我只是返回一个 IEnumerable 项,因此没有包装对象可以放入元数据。
我可以使用 .Data()
将元数据附加到读取请求,但我需要反过来做。取回元数据后,我需要能够将其存储在 javascript 变量中,以便我可以将其发送到 .Data()
我不知道您实际上是如何触发 NextPage、PreviousPage 操作的,但是...
您可以使用 MVC 自定义数据源配置来访问更多选项,例如架构配置。
http://docs.telerik.com/aspnet-mvc/getting-started/custom-datasource
Schema 配置允许您添加可以采用自定义结果格式的 Parse 函数:
{ 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()
)
示例 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>
示例网格读取操作:
[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
});
}
这不是一个完整、稳健的解决方案,但我认为它可以变得可行,并且至少会为您指明一个可能的方向。
我正在使用带有 asp.net MVC 的网格。当前网格正在使用 .DataSource(c => c.Read())
调用 URL,returns 和进入网格的 IEnumerable<item>
。
我想在网格中实现分页。但是数据没有正常的分页方法(计数,页码等)。
相反,当我在内部检索数据时,我会像这样取回数据:
{ items: [. . . ], nextPage: 'J23jeg9e93', previousPage: 'oqow0r93285' }
要获取下一页,您必须再次请求数据,但包括下一页或上一页的分页令牌。
目前我只将项目数组返回到网格,因此没有 nextPage/previousPage 元数据。
我看不出有什么方法可以包含此元数据,因为我只是返回一个 IEnumerable 项,因此没有包装对象可以放入元数据。
我可以使用 .Data()
将元数据附加到读取请求,但我需要反过来做。取回元数据后,我需要能够将其存储在 javascript 变量中,以便我可以将其发送到 .Data()
我不知道您实际上是如何触发 NextPage、PreviousPage 操作的,但是...
您可以使用 MVC 自定义数据源配置来访问更多选项,例如架构配置。 http://docs.telerik.com/aspnet-mvc/getting-started/custom-datasource
Schema 配置允许您添加可以采用自定义结果格式的 Parse 函数:
{ 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()
)
示例 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>
示例网格读取操作:
[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
});
}
这不是一个完整、稳健的解决方案,但我认为它可以变得可行,并且至少会为您指明一个可能的方向。