代码之家  ›  专栏  ›  技术社区  ›  Yanayaya

我应该使用异步方法选择KendoUI网格中的行吗?

  •  0
  • Yanayaya  · 技术社区  · 5 年前

    在KendoUI网格上选择行时遇到问题。我有两个网格,需要根据控制器返回的数据预先选择行。问题是,选择过程没有持续工作,这似乎是因为数据访问时间,即控制器返回通过ajax功能客户端请求的数据所需的时间。

    为了验证这一理论,我在控制器中设置了一个间隔,以错开返回的数据,它起到了作用,但又一次,它并不一致。以下是两个网格的代码:

    容器网格

    @(Html.Kendo().Grid<Vessel>()
        .Name("VesselGrid")
        .Columns(columns => {
            columns.Select().Width(50);
            columns.Bound(p => p.Id);
            columns.Bound(p => p.Name);
        })
        .Pageable()
        .Selectable(selectable => selectable.Mode(GridSelectionMode.Multiple))
        .Scrollable()
        .Filterable(ftb => ftb.Mode(GridFilterMode.Row))
        .PersistSelection()
        .HtmlAttributes(new { style = "height:550px;" })
        .DataSource(dataSource => dataSource
            .Ajax()
            .ServerOperation(true)
            .PageSize(20)
            .Model(m => m.Id(x => x.Id))
            .Read(read => read.Action("ReadVessels", "Core"))))
    

    柱网

     @(Html.Kendo().Grid<VesselColumn>()
         .Name("columnGrid")
         .Columns(columns => {
             columns.Bound(p => p.Id);
             columns.Bound(p => p.ColumnName);
         })
         .Pageable()
         .Sortable(Sortable => Sortable.AllowUnsort(true))
         .Selectable(selectable => selectable.Mode(GridSelectionMode.Multiple))
         .Scrollable()
         .Filterable(ftb => ftb.Mode(GridFilterMode.Row))
         .PersistSelection()
         .HtmlAttributes(new { style = "height:550px;" })
         .DataSource(dataSource => dataSource
             .Ajax()
             .ServerOperation(true)
             .PageSize(20)
             .Model(m => m.Id(x => x.Id))
             .Read(read => read.Action("ReadVesselColumns", "Core"))))
    

    下面是在document ready上调用的ajax函数,它应该预先选择每个网格上的行。

    $(function () {     
        $.ajax({
            type: 'POST',
            url: '/Test/ReadUserVessels',
            data: { Id: 230 },
            success: function (data) {
                setVessels(data);
            },
            error: function () {
                alert('error');
            }
        });
    
       
        $.ajax({
            type: 'POST',
            url: '/Test/ReadUserColumns',
            data: { Id: 230 },
            success: function (data) {
                setColumns(data);
            },
            error: function () {
                alert('error');
            }
        });
    
        function setVessels(data) {
            $(data.vessels).each(function (vIndex, vValue) {
                $("#vesselGrid").getKendoGrid()._selectedIds[vValue.VesselId] = true;
            });            
        }
        function setColumns(data) {
            $(data.columns).each(function (cIndex, cValue) {
                $("#columnGrid").getKendoGrid()._selectedIds[cValue.ColumnId] = true;
            });
        }
    })
    

    以下是将数据返回到这些函数以突出显示行的控制器操作。

    public async Task<JsonResult> ReadUserVessels(int? id) {
        IEnumerable<UserVessels> vessels = _userVesselService.GetUserVessels().Where(x => x.ViewId == id).ToList();
        return Json(new { success = true, vessels });
    }
            
    public async Task<JsonResult> ReadUserColumns(int? id) {
        IEnumerable<UserColumn> columns = _userColumnService.GetUserColumns().Where(x => x.ViewId == id).ToList();            
        return Json(new { success = true, columns});
    }
    

    如您所见,当文档准备就绪时,页面被加载,同时对两个控制器操作进行两个ajax调用。从那里,网格上的行应该被选中并以蓝色突出显示。只有船只网格能做到这一点。

    我的猜测是,由于请求发出,无论哪个进程处理网格上行的选择,当columns网格要求做同样的事情时,它仍然在使用。这是一个理论,我通过设置控制器动作的间隔来测试,该间隔为2秒。它奏效了,但前后不一致。

    所以,我的问题是,我应该使用异步控制器操作来访问数据吗?如果是,有人能帮助我如何实现这一点吗?或者我的方法是否不正确?

    0 回复  |  直到 5 年前
        1
  •  0
  •   G_P    5 年前

    现在的情况是,您的网格数据并不总是在文档就绪启动时填充,这就是为什么您会看到不一致的行为。

    要解决这个问题,请连接 databound event 你的网格。一旦检索到所有数据,就会触发databound事件。然后,将ajax调用(ReadUserVessers和ReadUserColumns)从document ready移动到各自网格的数据绑定事件处理程序。

    代码示例:

    血管网格与js函数

    @(Html.Kendo().Grid<Vessel>()
        .Name("VesselGrid")
        .Columns(columns => {
            columns.Select().Width(50);
            columns.Bound(p => p.Id);
            columns.Bound(p => p.Name);
        })
        .Pageable()
        .Selectable(selectable => selectable.Mode(GridSelectionMode.Multiple))
        .Scrollable()
        .Filterable(ftb => ftb.Mode(GridFilterMode.Row))
        .PersistSelection()
        .HtmlAttributes(new { style = "height:550px;" })
        .Events(events => events.DataBound("vesselGridDataBound"))
        .DataSource(dataSource => dataSource
            .Ajax()
            .ServerOperation(true)
            .PageSize(20)
            .Model(m => m.Id(x => x.Id))
            .Read(read => read.Action("ReadVessels", "Core"))))
    
    
    <script>
      function vesselGridDataBound(e) {
        $.ajax({
            type: 'POST',
            url: '/Test/ReadUserVessels',
            data: { Id: 230 },
            success: function (data) {
                setVessels(data);
            },
            error: function () {
                alert('error');
            }
        });
      }
    </script>