【问题标题】:Json Result can't be binded to KendoUI gridJson 结果无法绑定到 KendoUI 网格
【发布时间】:2017-05-16 18:52:26
【问题描述】:

我无法在剑道网格中显示从控制器返回的数据作为 Json 结果。

    [HttpPost]
    public ActionResult PermitSearch(BptSearchViewModel viewModel)
    {
        var data = appService.SearchPermitInspection(viewModel);

        return Json(data);
    }

现在从我的角度来看,我正在使用 ajax 提交信息

  @using (Ajax.BeginForm("PermitSearch", "Home", null, new AjaxOptions
  {
        HttpMethod = "post",
        InsertionMode = InsertionMode.InsertAfter,
        UpdateTargetId = "search-results-grid",
        OnComplete = "OnCompleteMethod"
  }))
  {
           ....
  }

<div id="search-results-grid"></div>

下面是带有 OnCompleteMethod 的脚本

function OnCompleteMethod(dataq, status) {
    if (status === "success") {
        $("#search-results-grid").kendoGrid({
            columns: [
                {
                    field: "jobname",
                    title: "Job Type"
                },
            dataSource: {
                data: {
                    "items" : dataq
                },
                schema: {
                    data: "items"
                }
            },
            groupable: true,
            sortable: true,
            pageable: {
                refresh: true,
                pageSizes: true,
                buttonCount: 5
            },
            noRecords: {
                template: "No data available on current page. Current page is: #=this.dataSource.page()#"
            }
        });
    }
}

调用控制器后返回的数据如下所示

[
  {
    "jobname": "job1"
  },
  {
    "jobname": "job2"
  }
]

我看到的有效示例是使用数组中不带引号的对象的键,就像这样,但我找不到任何可以应用的转换来将 json 数据传递到其中的网格方式。

 [
      {
        jobname: "job1"
      },
      {
        jobname: "job2"
      }
 ]

你可以在这里看到浏览器的响应

我在这里做错了什么?

【问题讨论】:

  • 进入OnCompleteMethod函数时dataqstatus包含什么?
  • 您已定义架构以在名为“items”的属性中查找数据,但我不认为这是 JSON 示例中的属性,尝试返回一个名为“items”的数组,它应该绑定。
  • @StephenByrne 我尝试了您的方法,但仍然无法正常工作,如果我将我在响应中看到的数据直接复制并粘贴为脚本的一部分,我可以看到其中的元素,但是当我更新我的问题时,作为函数的参数传递似乎采用不同的格式,但奇怪的是,即使在脚本中粘贴带有双引号的代码似乎也可以,对此有什么帮助吗?跨度>
  • @Heinrich - 你可以尝试将dataSource: {data: { "items" : dataq}}, 更改为dataSource: {data: dataq} 因为iirc,当你使用这样的dataSource 时,没有“items”属性,你只需将数据数组直接放入进入“数据”属性。

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


【解决方案1】:

如果dataqlocal data,其中包含一个对象数组,其中包含网格中所需的所有项目,请尝试使用网格定义:

$("#search-results-grid").kendoGrid({
    columns: [{
        field: "jobname",
        title: "Job Type"
    }],
    dataSource: {
        data: JSON.parse(dataq),
        pageSize: 10               
    },
    groupable: true,
    sortable: true,
    pageable: {
        refresh: true,
        pageSizes: true,
        buttonCount: 5
    },
    noRecords: {
        template: "No data available on current page. Current page is: #=this.dataSource.page()#"
    }
});

编辑

根据 OP 更新以包含 dataq 的定义,并添加了 pageSize 属性以防止在网格分页中出现空值。

这个Dojo 示例对我来说很好(使用您的问题中指定的两种格式)?

编辑 2 - 找到解决方案

在继续我们的讨论之后,发现dataq 包含来自控制器功能的全部响应。因此,您需要从dataq 访问responseText,因为它是一个JSON 字符串,您需要执行JSON.parse(dataq.responseText) 以便将其提取到适合网格数据源的对象列表中。

【讨论】:

  • 它不起作用,如果我只是将数据作为脚本的一部分,它会正确呈现,但如果我将它作为参数传递,那么不,控制台显示此错误“e.slice不是函数”
  • 那么您的数据不会以与您在问题中发布的相同格式传递给函数。在执行OnCompleteMethod 并编辑您的问题时,使用控制台查看dataq 是什么。
  • 我使用一个数据集或另一个数据集没有区别吗?我包含了一个道场示例。
  • 我之前试过你的例子,当我在
  • 我更新了 Dojo 示例以包含 schema.model 定义。您可以尝试一下吗,如果仍然没有成功,请尝试删除控制器返回的数据周围的Json()。如果仍然不高兴,请张贴dataq 包含在OnCompleteMethod 中的图片。
【解决方案2】:

我认为您应该尝试通过在 razor 代码中使用网格 htmlhelper 而不是 javascript 函数来构建网格。

您可以参考Ajax binding in the Telerik documentation here

基本上,如果网格的填充是您在该视图上唯一需要 Ajax 的东西,那么您甚至不需要那个“使用”规范。相反,它会在网格配置中指定。同样,您也不需要 javascript 代码...视图剃刀中的网格可能如下所示:

@(Html.Kendo().Grid<BptSearch>()
     .Name("search-results-grid")
     .DataSource(dataSource => dataSource
          .Ajax()
          .Read(read => read.Action("PermitSearch", "[controller]"))
      )
      .Columns(columns =>
          {
              columns.Bound(job => job.jobID).Title("Job ID");
              columns.Bound(job => job.jobName).Title("Job Type");
          })
      .Pageable()
      .Sortable()
   )

如果未显示任何结果,则在寻呼机中显示“没有要显示的记录”消息(这是设计使然)。

这个Grid FAQ 对你来说可能也是一个很好的参考,如果你想用它做其他事情。

【讨论】:

  • 实际上我试图不使用 Kendo Helpers,你知道它是什么导致我在 javascript 中出现错误吗?
  • 看起来在你的javascript中你需要从“columns:”之后删除“[”,并在“dataSource”之前的“}”之后添加一个逗号。如果那不适合你,那么我不确定。为什么不使用 html 助手?
  • 我通常发现通过使用 Javascript 而不是助手,您可以更好地控制剑道控制的各个方面。不过,这只是我的看法。
  • 另外,包装器不是免费的 - 您需要购买许可证。
猜你喜欢
  • 2015-06-16
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多