Telerik MVC网格,获得IQueryable匹配当前用户过滤器

时间:2013-12-12 20:37:05

标签: asp.net-mvc asp.net-mvc-4 telerik telerik-grid telerik-mvc

我有来自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。

谢谢,

1 个答案:

答案 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;
  }