0

如何在 ASP.NET MVC 中将 Kendo 网格过滤器发送到操作?

我正在使用这种结构并且它正在工作,但我无法在控制器中获得发送值。实际中的参数“模型”为空。

    $('#btn-print').click(function () {
        filter = $('#trips').data('kendoGrid').dataSource.filter();
        $.ajax({
            type: 'post',
            url: '@Url.Action("Print", "Trips")',
            //dataType: 'json',
            data: filter,
            success: function (d) {
                var win = window.open('about:blank');
                with (win.document) {
                    open();
                    write(d);
                    close();
                }
                //alert('print click.');
            }
        })
    });

ASP.NET 操作

    [HttpPost]
    public ActionResult Print(object model)
    {
        var r = Request;
        return View();
    }

谢谢你。:)

4

1 回答 1

0

你的方法让我有点吃惊。为什么不直接创建

var customDS = new kendo.data.dataSource(  
    transport: 
    {
      read: 
      {
        url: '@Url.Action("Print","Trips")',
        dataType: 'aspnetmvc-ajax'
      }
    },
  requestEnd: function (d) {
                var win = window.open('about:blank');
                with (win.document) {
                    open();
                    write(d);
                    close();
                }
});)

并简单地复制过滤器?

if ($('#trips').data('kendoGrid').dataSource.filter())
{
   // if no filters are applied .filter() might return undefined, so to prevent
   // errors lets check if any filters are applied
   var filters = $('#trips').data('kendoGrid').dataSource.filter().filters;
   customDS.filter(filters);
}

然后继续进行旅行网格。请注意,dataType 不是 json。

但是,如果您绝对必须在不使用 dataSource 和 as json 的情况下这样做,那么它会变得更加困难。dataSource.filter() 返回由“过滤器”数组和“逻辑”组成的对象。过滤器中的每个元素都是由“字段”、“值”和“运算符”组成的对象。目前,您的参数“模型”为空仅仅是因为您没有发送任何由名称“模型”定义的内容。实际上,您的数据如下所示:

data: { filters: [somearray], logic: 'somelogic' }

如果你想将它作为 json 传递,你在控制器中的参数应该反映你真正发送的内容(或者你可以绑定前缀),以便反序列化可以发挥它的魔力。所以它要么

data: {model : filter}

或者

 public ActionResult Print(Filters filters, string logic)

其中 Filters 是一个有 3 个字段的类,与客户端dataSource.filter().filters数组相同。并且因为其中一个字段是 'operator',它是 AFAIR C# 受限关键字,所以您还必须将所有数据从 'filters' 移动到一些 'temporaryFilters: {field:'', value:'', _operator: ''}。这是太多的工作,所以放弃那个解决方案并使用数据源之一:)

于 2013-04-24T19:38:00.040 回答