【问题标题】:How can I access the model for the selected item in a Kendo UI Grid如何访问 Kendo UI Grid 中所选项目的模型
【发布时间】:2013-12-31 14:22:36
【问题描述】:

我的 ASP.NET MVC 应用程序中有一个可选择的 kendoUI 网格。如何获取所选项目的强类型模型对象?我尝试了以下代码,但它不起作用。

@(Html.Kendo().Grid<Backup>(Model.Backups)
    .Name("MatchingBackupsGrid")
    .Columns(col =>
        {
            col.Bound(backup => backup.BackupUId).Title("UID");
            col.Bound(backup => backup.BackupFirstName).Title("First Name");
            col.Bound(backup => backup.BackupLastName).Title("Last Name");
        })
        .Scrollable()
        .Selectable(sel =>
        {
            sel.Mode(GridSelectionMode.Single);
            sel.Type(GridSelectionType.Row);
        })
         .DataSource(dataSource => dataSource
            .Server()
            .Read(read => read.Action("SearchForBackup", "Arr", new { lastName = Model.SearchTerm }))
            .Model(model => model.Id(backup => backup.BackupUId))
         )
    )

function SelectBackupButtonClickHandler() {

    var grid = $("#MatchingBackupsGrid").data("kendoGrid");

    var selectedBackup = grid.dataItem(grid.select());

    console.log(selectedBackup);
}

【问题讨论】:

  • 什么不起作用?您是否检查过SelectBackupButtonClickHandler 是否被实际调用?你检查grid,select() 是否真的返回了任何东西?
  • 仅供参考,该函数未包含在
  • 对不起,各位,我只是一口气发布了相关的sn-p。我在正确的脚本标记中有 JavaScript 代码,并且正在调用事件侦听器,grid.select() 也确实返回了一个正确的数组,其中只有一项。我只是不知道如何从那里得到一个强类型模型对象。

标签: asp.net-mvc asp.net-mvc-4 kendo-ui kendo-grid kendo-asp.net-mvc


【解决方案1】:

网格行选择响应 Kendo change 事件。

@(Html.Kendo().Grid<Backup>(Model.Backups)
    .Name("MatchingBackupsGrid")
    .Columns(col =>
        {
            col.Bound(backup => backup.BackupUId).Title("UID");
            col.Bound(backup => backup.BackupFirstName).Title("First Name");
            col.Bound(backup => backup.BackupLastName).Title("Last Name");
        })
        .Scrollable()
        .Selectable(sel =>
        {
            sel.Mode(GridSelectionMode.Single);
            sel.Type(GridSelectionType.Row);
        })
         .DataSource(dataSource => dataSource
            .Server()
            .Read(read => read.Action("SearchForBackup", "Arr", new { lastName = Model.SearchTerm }))
            .Model(model => model.Id(backup => backup.BackupUId))
         )
    )
<script>
function SelectBackupButtonClickHandler() {
    var selectedBackup = this.dataItem(this.select());
    console.log(selectedBackup);
}

$("#MatchingBackupsGrid").data("kendoGrid").bind("change", SelectBackupButtonClickHandler);
</script>

【讨论】:

    【解决方案2】:

    当您使用客户端代码时,您只能访问客户端数据;您无法使用grid.dataItem() 访问强类型模型。如果你想这样做,你需要将项目的 id 发送到服务器,例如使用 AJAX 请求,并在那里继续您的工作;所以你必须做这样的事情:

    function SelectBackupButtonClickHandler() {
        var grid = $("#MatchingBackupsGrid").data("kendoGrid");
        var selectedBackup = grid.dataItem(grid.select());
        var id = selectedBackup.id;
    
        $.ajax({
           type: "POST",
           url: yourUrl, // post to your controller action that does what you want to do with the model
           dataType: "json",
           data: { id: id } 
        };
    }
    

    【讨论】:

    • 根据 Kendo UI 文档,服务器绑定模式支持客户端 change 事件(适用于选择):docs.kendoui.com/getting-started/using-kendo-with/aspnet-mvc/…(滚动到底部)
    • @EfrainReyes 我读到的方式,它说这些事件将在服务器绑定模式下引发,但这并不意味着您可以在服务器端执行其中的代码(因为它们仍然是客户端事件) - 再说一次,我对 MVC 包装器没有广泛的了解,所以也许有更好的方法来做到这一点(尽管我认为它必须在最终以类似的方式)
    • 对不起,@LarsHöppner。客户端确实得到了一个完整的模型。我在控制台/调试器/浏览器调试器工具中看到它。我不知道我做错了什么。我正在索引 selectedBackup 假设它是一个数组。然后我有一次将数组的每个项目映射到某个东西。
    • @WaterCoolrv2 “完整”模型是什么意思?当然它会包含所有数据,但它将是一个 JavaScript 对象,而不是您在服务器上与之交互的强类型模型,这正是您所要求的。
    【解决方案3】:

    使用kendoHelpers可以获取选中项的dataItem

    // Get the grid
    var grid = $('#SampleGrid').data('kendoGrid');
    
    // Call your desired function
    var dataItem = kendoHelpers.grid.getSelectedDataItem(grid);
    
    // Manipulate the results
    if (dataItem != null){
        // dataItem.MyId = ...
    }
    

    另一种方法getSelectedDataItemByCurrentCell 不要求网格是可选择的并且适用于活动单元格。

    该库还有许多其他帮助函数。

    【讨论】:

      【解决方案4】:

      我不知道我之前在做什么,我的代码现在可以工作了。

      我尝试了很多东西——我出于某种原因假设grid.select() 返回一个数组,所以我尝试应用索引器来获取数组的第一个元素,如下所示:

      var selectedBackups = grid.select();
      
      // strangely, the Visual Studio intellisense mislead 
      // me here as it showed me the model properties on 
      // indexing this array
      selectedBackups[0].BackupFirstName;
      

      我也尝试过像这样对数组进行转换:

      var names = $.map(grid.select(), function(item)
      {
          return item.BackupFirstName + ' ' + item.BackupLastName;
      });
      

      我尝试了很多想法,以至于我忘记检查我的原始代码确实实际上是否具有所选行的强类型模型。

      所以,为了记录,问题中的代码是正确的,并在下面转载。要在单选模式 KendoUI 网格中获取所选项目,请执行以下操作:

      var grid = $("#MatchingBackupsGrid").data("kendoGrid");
      
      // this is a single object and not an array
      // this is your strongly typed model object
      var selectedBackup = grid.dataItem(grid.select());
      
      console.log(selectedBackup);
      

      【讨论】:

      • 您从 grid.select() 获得的所有内容都是一个 JavaScript 对象-它将具有所有属性,但它不是您在服务器上与之交互的强类型模型-边;如果您的问题得到解决,那很好,但是如果您的问题确实是由错误或误解引起的,那么您应该关闭您的问题(因为它是无效的)或接受您所要求的正确答案
      猜你喜欢
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多