Jquery 如何从数据源事件处理程序获取kendoGrid id?

Jquery 如何从数据源事件处理程序获取kendoGrid id?,jquery,asp.net-mvc,kendo-ui,Jquery,Asp.net Mvc,Kendo Ui,我在razor视图(MVC4)中定义了剑道网格,我还有数据源事件处理程序-onRequestStart,如下所示: function onRequestStart(e){ var gridId = e.sender... //the rest of the code } 我试图做的是在函数内部获取gridId,而不将其作为参数传递给该函数。我还尝试: e.sender.element.closest('[data-role="grid"]'); 以及: 但它不起作用Kendov

我在razor视图
(MVC4)
中定义了剑道网格,我还有数据源事件处理程序-onRequestStart,如下所示:

function onRequestStart(e){
     var gridId = e.sender...   //the rest of the code
}
我试图做的是在函数内部获取
gridId
,而不将其作为参数传递给该函数。我还尝试:

e.sender.element.closest('[data-role="grid"]');
以及:


但它不起作用
Kendo
version
2016.1.226

根据评论,可能最简单的方法是配置要显示的每个网格的网格数据绑定和数据绑定事件

因此,在.cshtml中

@(Html.Kendo().Grid<grid-1-model-class>()
  .Name("grid1")
  .Events(events => {
     events.DataBinding("commonDataBinding");
     events.DataBound("commonDataBound");
  })
  .DataSource (...)
  .Columns(...)
  ...
)

@(Html.Kendo().Grid<grid-2-model-class>()
  .Name("grid2")
  .Events(events => {
     events.DataBinding("commonDataBinding");
     events.DataBound("commonDataBound");
  })
  .DataSource (...)
  .Columns(...)
  ...
)

<script>
function commonDataBinding(e) {
  // going for data
}
function commonDataBound(e) {
  // data is gotten
}
</script>
@(Html.Kendo().Grid())
.名称(“grid1”)
.Events(Events=>{
事件。数据绑定(“commonDataBinding”);
事件。数据绑定(“commonDataBound”);
})
.数据源(…)
.列(…)
...
)
@(Html.Kendo().Grid())
.名称(“grid2”)
.Events(Events=>{
事件。数据绑定(“commonDataBinding”);
事件。数据绑定(“commonDataBound”);
})
.数据源(…)
.列(…)
...
)
函数公共数据绑定(e){
//寻找数据
}
函数commonDataBound(e){
//获取数据
}

e.sender
将是剑道网格组件。

您可以像这样创建一个自定义网格小部件,并添加附加的网格(如果您一次不使用多个网格)

这是它的道场。


var CustomGrid=kendo.ui.Grid.extend({
选项:{
名称:“CustomGrid”
},
_数据源:函数(){
kendo.ui.Grid.fn.\u dataSource.call(this);
this.dataSource.attachedGrid=this;
}
});
插件(CustomGrid);
$(“#我的网格”).kendoCustomGrid({
数据源:{
请求启动:函数(e){
console.log(e.sender.attachedGrid);
var gridId=e.sender.attachedGrid.element.attr('id');
},
数据:[
{id:1,全名:'David Lebee'},
{id:2,全名:'Chuck Norris'}
]
}
});
如果你问我的话,更多的是黑客,更少的是干净,但是由于你使用的是CSharp构建器,我怀疑你是否想继承他们的fluent构建器(不得不经历一次这样的麻烦)

您可以通过自己的小部件类覆盖网格,如下所示

这里又是道场:


var originalDataSourceMethod=kendo.ui.Grid.fn.\u数据源;
var overrideGrid=kendo.ui.Grid.extend({
_数据源:函数(){
originalDataSourceMethod.call(this);
this.dataSource.attachedGrid=this;
}
});
插件(overrideGrid);
$(“#我的网格”).kendoGrid({
数据源:{
请求启动:函数(e){
console.log(e.sender.attachedGrid);
var gridId=e.sender.attachedGrid.element.attr('id');
},
数据:[
{id:1,全名:'David Lebee'},
{id:2,全名:'Chuck Norris'}
]
}
});

一个数据源可以连接到多个网格。如果需要特定的网格,请使用声明网格的razor代码中指定的名称。因此,对于
Html.kendo().Grid().Name(“myGrid”)…
onRequestStart将具有
Grid_组件=$(“#myGrid”).data('kendoGrid')是的,但我正在为应用程序中的每个网格开发一个动态方法。这就是我需要从数据源捕获gridId信息的原因。我认为kendo小部件中的“侦听/处理”概念是通过让它们将关联数据源的更改事件绑定到引用小部件的匿名函数来实现的。这种匿名性使得“获取听众名单”的过程比听起来更复杂。如果检查数据源的
\u events
属性,它将是绑定到它的一个数组。动态的本质是什么,您需要在请求开始时知道使用数据源的网格?我想在所有“读取”请求开始时显示自定义数据加载器,并在数据绑定结束后隐藏它。一般情况下,每个网格都应该在一个函数中完成此操作。@DzananBegovic请您花点时间查看答案,看看它是否能解决您的问题?是的,您的解决方案似乎很好。我已经尝试过这种方法,但我目前正在开发已经实现了这两种方法的解决方案,所以我在这两种方法中的代码并没有我所期望的行为。无论如何,谢谢你的帮助,看来我需要为这个问题找到另一个解决方案。
@(Html.Kendo().Grid<grid-1-model-class>()
  .Name("grid1")
  .Events(events => {
     events.DataBinding("commonDataBinding");
     events.DataBound("commonDataBound");
  })
  .DataSource (...)
  .Columns(...)
  ...
)

@(Html.Kendo().Grid<grid-2-model-class>()
  .Name("grid2")
  .Events(events => {
     events.DataBinding("commonDataBinding");
     events.DataBound("commonDataBound");
  })
  .DataSource (...)
  .Columns(...)
  ...
)

<script>
function commonDataBinding(e) {
  // going for data
}
function commonDataBound(e) {
  // data is gotten
}
</script>
<div id="my-grid"></div>
  <script>

    var CustomGrid = kendo.ui.Grid.extend({
        options: {
            name: 'CustomGrid'
        },
        _dataSource: function() {
          kendo.ui.Grid.fn._dataSource.call(this);
          this.dataSource.attachedGrid = this;
        }
    });

    kendo.ui.plugin(CustomGrid);

    $('#my-grid').kendoCustomGrid({
        dataSource: {
          requestStart: function(e) {
                console.log(e.sender.attachedGrid);
                var gridId = e.sender.attachedGrid.element.attr('id');
          },
          data: [
            { id: 1, fullname: 'David Lebee' }, 
            { id: 2, fullname: 'Chuck Norris' } 
          ]
        }
    });
  </script>
<div id="my-grid"></div>
  <script>

    var originalDataSourceMethod = kendo.ui.Grid.fn._dataSource;

    var overrideGrid = kendo.ui.Grid.extend({
        _dataSource: function() {
          originalDataSourceMethod.call(this);
          this.dataSource.attachedGrid = this;
        }
    });

    kendo.ui.plugin(overrideGrid);

    $('#my-grid').kendoGrid({
        dataSource: {
          requestStart: function(e) {
                console.log(e.sender.attachedGrid);
                var gridId = e.sender.attachedGrid.element.attr('id');
          },
          data: [
            { id: 1, fullname: 'David Lebee' }, 
            { id: 2, fullname: 'Chuck Norris' } 
          ]
        }
    });
  </script>