我有来自MVC Extensions的Telerik Grid,我正在尝试根据网格中的数据创建导出到xlsx。
问题是,我不太确定如何获取有关网格中实际用户过滤器的信息。
假设用户通过在Name上应用过滤器来过滤网格,就像名称以“Bu”开头一样。此外,用户按年龄排序。
网址类似于:
?listing-1-page=1&listing-1-orderBy=Age-asc&listing-1-groupBy=~&listing-1-filter=Name~startswith~'Bu'
我可以肯定地将其解析为字符串并获取我需要的数据。但是,这种解析将非常复杂,并且与此特定网格过于紧密相关。
问题是,
有没有办法从网格中获取IQueryable?根据我的发现,这个IQueryable是在OnActionExecuted中执行Action方法之后生成的。 我的想法是,我将按钮添加到网格工具栏,它将调用ActionMethod
public FileStreamResult MyExportMethod()
并且在这种方法中,我“以某种方式”从网格中获取IQueryable。
谢谢,
答案 0 :(得分:0)
如果它的网格与服务器绑定一起使用,则无法使用此处显示的Client Event OnDataBound: http://demos.telerik.com/aspnet-mvc/razor/grid/customcommand(感谢ataravati')
然而, 事件OnLoad将被解雇。
解决方案可能如下所示:
在cshtml中:
t.Custom().HtmlAttributes(new { id = "export" }).
Text("Export").Action("Export", "Home", new { page = 1, orderBy = "~", filter = "~" });
.ClientEvents(events => events.OnLoad("OnLoad"))
<script type="text/javascript">
function OnLoad() {
var grid = $(this).data('tGrid');
// Get the export link as jQuery object
var $exportLink = $('#export');
// Get its 'href' attribute - the URL where it would navigate to
var href = $exportLink.attr('href');
// Update the 'page' parameter with the grid's current page
href = href.replace(/page=([^&]*)/, 'page=' + grid.currentPage);
// Update the 'orderBy' parameter with the grids' current sort state
href = href.replace(/orderBy=([^&]*)/, 'orderBy=' + (grid.orderBy || '~'));
// Update the 'filter' parameter with the grids' current filtering state
href = href.replace(/filter=(.*)/, 'filter=' + (grid.filterBy || '~'));
// Update the 'href' attribute
$exportLink.attr('href', href);
}
</script>
在Controler中
public ActionResult Export(int page, string orderBy, string filter)
{
IEnumerable orders = GetOrders().AsQueryable().ToGridModel(page, 10, orderBy, string.Empty, filter).Data;
}