Kendo Grid / DropDownList 组合缺少什么?

What's missing in this Kendo Grid / DropDownList combination?

似乎是 Kendo 网格的常见问题,但是呈现到工具栏中的下拉菜单需要向服务器发出 Ajax 请求并根据返回的数据刷新网格。我可以在 Fiddler 中看到 Ajax 调用已成功执行并且数据肯定会返回,但我们没有在网格上刷新任何内容。

查看代码如下:

<div class="grid-validation-error" id="unitgrid-validation-error">
</div>

  @(Html.Kendo()
  .Grid(Model)
  .Name("WheelchairAlertsGrid")
  .Sortable()
  .Scrollable(scr => scr.Height("100%"))
  .Filterable()
  .ToolBar(t => t.Template(
      @<text>
        <div class="toolbar">
            <label class="category-label" for="category">Show alerts for:</label>
            @(Html.Kendo().DropDownList()
                        .Name("filter-periods")
                        .DataTextField("Text")
                        .DataValueField("Value")
                        .OptionLabel("Month")
                        .Events(e => e.Change("filterPeriodChange"))
                        .BindTo(new List<SelectListItem>(){ 
                            new SelectListItem{ Text = "Day", Value = "Day" }, 
                            new SelectListItem{ Text = "Week", Value = "Week" },
                            new SelectListItem{ Text = "Month", Value = "Month" } })
            )

        </div>
      </text>
      ))
  .Pageable(paging => paging.Messages(msg => msg.Display(ResourceManager.RetrieveResource("PagingFormat"))))
  .Columns(
      col =>
      {
          col.Bound(um => um.SerialNumber).Width(150).Title("Wheelchair").ClientTemplate
             (
                 "<a href='" +
                 Url.DealerGroupAction("Index", "Wheelchair") +
                 "/#= WheelchairDataAssignmentId #'>#= SerialNumber #" + "</a>"
             );
          col.Bound(um => um.Name).Width(150);
          col.Bound(um => um.ChargeAlert).Width(60);
          col.Bound(um => um.BatteryAbuse).Width(60);
          col.Bound(um => um.Flash).Width(60);
          col.Bound(um => um.Transmission).Width(60);
          col.Bound(um => um.DealerGroup).Width(100);
      })
)

这里是刷新数据的JS代码(注释掉了各种变体,也已经尝试但未能产生结果):

function filterPeriodChange(e) {

  var ddl = $('#filter-periods').data('kendoDropDownList');
    var grid = $('#WheelchairAlertsGrid').data("kendoGrid");
    $.getJSON('@Url.DealerGroupWheelChairAlertsApiUrl("WheelchairAlerts")', { filterPeriod: ddl.value() }, function (data) {
        grid.dataSource = data;
    });
}

总是有一些非常简单的事情导致了这类问题,但我只见树木不见森林。感谢任何帮助。

破解了。

需要告知 Kendo 网格数据源期望 Ajax 内容。所以代码应该如下所示:

... other stuff as above
.DataSource(ds => ds
    .Ajax()
    .PageSize(20)
)

下一个难题是确保在获取数据后正确设置数据源:

function filterPeriodChange(e) {

    var ddl = $('#filter-periods').data('kendoDropDownList');
    var grid = $('#WheelchairAlertsGrid').data("kendoGrid");

    $.getJSON('@Url.DealerGroupWheelChairAlertsApiUrl("WheelchairAlerts")', { filterPeriod: ddl.value() }, function (data) {
        var dataSource = new kendo.data.DataSource({
            data: data.Data,
            pageSize: 20
        });

        grid.setDataSource(dataSource);
    });

}

这似乎解决了问题。现在,在顶层更改我的下拉列表会调用我的 filterPeriodChange 方法,触发 Ajax 请求并重新绑定数据。