【问题标题】:e.slice is not a functione.slice 不是函数
【发布时间】:2021-02-17 03:41:45
【问题描述】:

我有一个使用 kendo UI 和 jquery 的 kendoDropDownList。我有这样的错误,不知道为什么会出现这个错误。

$("#drpState").kendoDropDownList({
                optionLabel: "States...",
                delay: 10,
                dataTextField: "Name",
                dataValueField: "StateId",
                dataSource: {
                    serverFiltering: true,
                    transport: {
                        read: {
                            headers: {
                                "__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val()
                            },
                            type: "Post",
                            dataType: "json",
                            url: "/Supervision/Tracking/GetStates",
                        }
                    }
                }
            }).data("kendoDropDownList");
        [HttpPost]
        public async Task<JsonResult> GetStates(DataSourceRequest request, CancellationToken cancellationToken = default)
        {
            request.Skip = 0;
            request.Take = 100;

            var states = await _stateService.GetStates(request, cancellationToken);

            return Json(states);
        }

返回的数据是一个DataSourceResult,它包含Aggregates、Data 和Total。显然,如您所见,Data 有一个对象数组。

【问题讨论】:

  • 请发布堆栈跟踪。
  • @GaloisGirl 我添加了那个。
  • 好了,这个不多说了。 e.slice() 很可能是 Array.prototype.slice(),所以预期是数组的东西不是。你的后端返回一个数组吗?
  • @GaloisGirl 是的,不幸的是,这并没有说太多。
  • 你的后端能不能 `return Json(states.Data);` 所以它返回一个数组?

标签: javascript jquery asp.net-core .net-core kendo-ui


【解决方案1】:

这是因为 Kendo 期望从请求响应中得到一个数组,并得到一个对象。您需要向 Kendo 指定在哪里可以找到该数组。在数据源上使用schema.data

dataSource: {
    serverFiltering: true,
    transport: {
        read: {
            headers: {
                "__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val()
            },
            type: "Post",
            dataType: "json",
            url: "/Supervision/Tracking/GetStates",
        }
    },
    schema: {
        data: "Data"
    }
}

或者你可以像@GaloisGirl 建议的那样直接返回一个数组。

【讨论】:

  • 感谢您的回答,但哪种方法更安全?我的意思是在安全的情况下是否有优先使用权?
  • 我觉得@DontVoteMeDown 的回答好一点,因为同一个后端方法可以服务多个前端服务,你可以说让数据适应他们的需求是他们的工作。或者你可以说,因为后端服务有复数名称,它应该返回复数:一个数组。这是细节,你会没事的。
  • 另外,我们之前可以在返回的结果中使用JsonRequestBehavior.AllowGet作为第二个参数来获得JSON格式的结果,但是现在由于安全原因在ASP .Net Core中省略了它,称为JSON劫持基于JSON Hijackinghttps://stackoverflow.com/a/9277717/10589806,现在我们需要一个纯数据集合,包括键值对传递给KendoDropdownList。我对吗? @GaloisGirl @DontVoteMeDown
  • 我没有在后端使用 ASP.NET 也不知道。
  • @siavashbashiri 我认为两种方式在安全方面都是一样的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 2019-12-20
  • 1970-01-01
相关资源
最近更新 更多