jquery 的 Telerik Kendo 网格不显示数据
Telerik Kendo grid for jquery does not show data
我的 kendo 网格定义如下:
var dataSource = new kendo.data.DataSource({
batch: false,
autoSync: true,
transport: {
read: {
url: "/monitoring/matrix/routecontentrules?format=json",
contentType: "application/json; charset=utf-8",
dataType: "json",
type: "POST",
timeout: 30000
},
update: {
url: "/monitoring/matrix/routecontentrules/updateroutecontentrule",
contentType: "application/json; charset=utf-8",
dataType: "json",
type: "PUT"
},
create: {
url: "/monitoring/matrix/routecontentrules/createroutecontentrule",
contentType: "application/json; charset=utf-8",
dataType: "json",
type: "POST"
},
destroy: {
url: "/monitoring/matrix/routecontentrules/deleteroutecontentrule",
contentType: "application/json; charset=utf-8",
dataType: "json",
type: "DELETE"
},
parameterMap: function (data, operation) {
if (operation == "read") {
return kendo.stringify({
RouteId: routeDataItem.RouteId
});
}
else if (operation == "destroy") {
return kendo.stringify({
Id: data.Id,
});
}
else {
return kendo.stringify({
Id: data.Id,
RouteId: routeDataItem.RouteId,
OrderId: data.OrderId,
SenderMatch: data.SenderMatch,
ContentMatch: data.ContentMatch,
SenderReplace: data.SenderReplace,
ContentReplace: data.ContentReplace,
});
}
}
},
schema: {
model: {
id: "Id",
fields: {
Id: { type: "number", defaultValue: 0 },
OrderId: { type: "number", defaultValue: 0 },
SenderMatch: { type: "string", defaultValue: "" },
ContentMatch: { type: "string", defaultValue: "" },
SenderReplace: { type: "string", defaultValue: "" },
ContentReplace: { type: "string", defaultValue: "" }
}
}
}});$("#Grid").kendoGrid({
dataSource: dataSource,
reorderable: false,
resizable: false,
sortable: false,
groupable: false,
scrollable: true,
navigatable: true,
editable: true,
columns: [
{
width: 150, field: "SenderMatch", title: "Sender match",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Sender match", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "ContentMatch", title: "Content match",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Content match", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "SenderReplace", title: "Sender replace",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Sender replace", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "ContentReplace", title: "Content replace",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Content replace", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
command: [
{ name: "destroy", template: "<a class='k-button k-grid-delete delete'><span class='k-sprite px-sprite px-i-sm-trash'></span></a>" }
],
width: "50px"
}
],
toolbar: kendo.template('<span class="ReloadManipulationByCustomer" style=""><span class="k-icon k-i-refresh refresh-btn"></span></span><a class="k-button k-grid-add add-btn" href="javascript:void(0)"><span class="k-sprite px-sprite px-i-sm-new new" />Add</a>')});$(".ReloadManipulationByCustomer").click(function () {
$("#Grid").data("kendoGrid").dataSource.read();});
后端我使用的是ServiceStack,请求定义如下:
[Route("/monitoring/matrix/routecontentrules/createroutecontentrule", "POST")]
[Route("/monitoring/matrix/routecontentrules/updateroutecontentrule", "PUT")]
public sealed class CreateUpdateRouteContentRuleRequest
{
public int Id { get; set; }
public int OrderId { get; set; }
public int RouteId { get; set; }
public string SenderMatch { get; set; }
public string ContentMatch { get; set; }
public string SenderReplace { get; set; }
public string ContentReplace { get; set; }
}
[Route("/monitoring/matrix/routecontentrules")]
public sealed class RouteContentRulesRequest
{
public int RouteId { get; set; }
}
[Route("/monitoring/matrix/routecontentrules/deleteroutecontentrule")]
public sealed class DeleteRouteContentRuleRequest
{
public int Id { get; set; }
}
public sealed class RouteContentRuleModel
{
public int Id { get; set; }
public int OrderId { get; set; }
public int RouteId { get; set; }
public string SenderMatch { get; set; }
public string ContentMatch { get; set; }
public string SenderReplace { get; set; }
public string ContentReplace { get; set; }
}
获取数据代码如下:
public object Post(RouteContentRulesRequest request)
{
return _dbConnectionFactory
.OpenReadOnlyAndRun(dbConn => dbConn.Select<RouteContentRule>(r => r.RouteId == request.RouteId).OrderBy(r => r.OrderId));
}
public object Any(CreateUpdateRouteContentRuleRequest request)
{
RouteContentRule entity;
if (!Db.Exists<Route>(new { Id = request.RouteId }))
{
throw new HttpError(HttpStatusCode.BadRequest, $"Route with id {request.RouteId} does not exist");
}
if (request.Id != 0)
{
var routeContentRule = _dbConnectionFactory.OpenReadOnlyAndRun(dbConn => dbConn.SingleById<RouteContentRule>(request.Id));
entity = request.ToEntity(routeContentRule);
Db.Update(entity, r => r.Id == routeContentRule.Id);
return entity.ToModel();
}
entity = request.ToEntity();
entity.OrderId = (_dbConnectionFactory.OpenReadOnlyAndRun(dbConn => dbConn.Scalar<RouteContentRule, int?>(x => Sql.Max(x.OrderId), x => x.RouteId == request.RouteId)) ?? 0) + 1;
var id = (int)Db.Insert(entity, true);
entity.Id = id;
return entity.ToModel();
}
public void Delete(DeleteRouteContentRuleRequest request)
{
Db.Delete<RouteContentRule>(new {Id = request.Id});
}
读取请求中的数据如下:
[
{
"Id":35,
"OrderId":1,
"RouteId":72303,
"SenderMatch":"335",
"ContentMatch":"",
"SenderReplace":"",
"ContentReplace":""
},
{
"Id":36,
"OrderId":2,
"RouteId":72303,
"SenderMatch":"55",
"ContentMatch":"",
"SenderReplace":"",
"ContentReplace":""
}
]
以下是来自 Chrome 开发者工具的图像:
问题是网格没有显示这些数据。如果我点击网格单元格,我可以看到数据在这里。在这种情况下,该单元格变为可编辑状态,并显示数据的当前值。但是一旦我将编辑移动到一些新的单元格之前隐藏数据。我正在检查单元格,我发现当单元格未编辑时,它描述如下:
<td style="text-align: right" aria-describedby="50349c08-da61-49d2-aa73-9c0823d4a4a4" role="gridcell">
<span><label class="SenderMatch" <="" label=""></label></span>
</td>
当单元处于edding模式时,html中描述如下:
<td style="text-align: right" aria-describedby="ccc2df23-b49a-4b00-820a-02a67c428a52" role="gridcell" id="Grid_active_cell" class="k-edit-cell" data-role="editable">
<input type="text" class="k-input k-textbox" name="SenderMatch" data-bind="value:SenderMatch">
</td>
我不知道为什么没有显示数据。据我所知,它应该显示数据,但它没有显示这些数据。
为什么要在 class 上添加 [Route]
属性......?它们应该在 Controller
的 Action
.
上
然后你可以打开Chrome的开发工具,查看network
选项卡,查看数据是否发送到back-end。
你可以把network
的图片贴出来给我们看看你觉得应该拿数据的时候,我们可以看看是什么问题。
我知道问题出在哪里了。
columns: [
{
width: 150, field: "SenderMatch", title: "Sender match",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Sender match", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "ContentMatch", title: "Content match",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Content match", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "SenderReplace", title: "Sender replace",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Sender replace", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "ContentReplace", title: "Content replace",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Content replace", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
command: [
{ name: "destroy", template: "<a class='k-button k-grid-delete delete'><span class='k-sprite px-sprite px-i-sm-trash'></span></a>" }
],
width: "50px"
}],
模板有问题。我删除了它们,现在显示了数据。命令模板仍然有效。
我的 kendo 网格定义如下:
var dataSource = new kendo.data.DataSource({
batch: false,
autoSync: true,
transport: {
read: {
url: "/monitoring/matrix/routecontentrules?format=json",
contentType: "application/json; charset=utf-8",
dataType: "json",
type: "POST",
timeout: 30000
},
update: {
url: "/monitoring/matrix/routecontentrules/updateroutecontentrule",
contentType: "application/json; charset=utf-8",
dataType: "json",
type: "PUT"
},
create: {
url: "/monitoring/matrix/routecontentrules/createroutecontentrule",
contentType: "application/json; charset=utf-8",
dataType: "json",
type: "POST"
},
destroy: {
url: "/monitoring/matrix/routecontentrules/deleteroutecontentrule",
contentType: "application/json; charset=utf-8",
dataType: "json",
type: "DELETE"
},
parameterMap: function (data, operation) {
if (operation == "read") {
return kendo.stringify({
RouteId: routeDataItem.RouteId
});
}
else if (operation == "destroy") {
return kendo.stringify({
Id: data.Id,
});
}
else {
return kendo.stringify({
Id: data.Id,
RouteId: routeDataItem.RouteId,
OrderId: data.OrderId,
SenderMatch: data.SenderMatch,
ContentMatch: data.ContentMatch,
SenderReplace: data.SenderReplace,
ContentReplace: data.ContentReplace,
});
}
}
},
schema: {
model: {
id: "Id",
fields: {
Id: { type: "number", defaultValue: 0 },
OrderId: { type: "number", defaultValue: 0 },
SenderMatch: { type: "string", defaultValue: "" },
ContentMatch: { type: "string", defaultValue: "" },
SenderReplace: { type: "string", defaultValue: "" },
ContentReplace: { type: "string", defaultValue: "" }
}
}
}});$("#Grid").kendoGrid({
dataSource: dataSource,
reorderable: false,
resizable: false,
sortable: false,
groupable: false,
scrollable: true,
navigatable: true,
editable: true,
columns: [
{
width: 150, field: "SenderMatch", title: "Sender match",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Sender match", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "ContentMatch", title: "Content match",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Content match", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "SenderReplace", title: "Sender replace",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Sender replace", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "ContentReplace", title: "Content replace",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Content replace", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
command: [
{ name: "destroy", template: "<a class='k-button k-grid-delete delete'><span class='k-sprite px-sprite px-i-sm-trash'></span></a>" }
],
width: "50px"
}
],
toolbar: kendo.template('<span class="ReloadManipulationByCustomer" style=""><span class="k-icon k-i-refresh refresh-btn"></span></span><a class="k-button k-grid-add add-btn" href="javascript:void(0)"><span class="k-sprite px-sprite px-i-sm-new new" />Add</a>')});$(".ReloadManipulationByCustomer").click(function () {
$("#Grid").data("kendoGrid").dataSource.read();});
后端我使用的是ServiceStack,请求定义如下:
[Route("/monitoring/matrix/routecontentrules/createroutecontentrule", "POST")]
[Route("/monitoring/matrix/routecontentrules/updateroutecontentrule", "PUT")]
public sealed class CreateUpdateRouteContentRuleRequest
{
public int Id { get; set; }
public int OrderId { get; set; }
public int RouteId { get; set; }
public string SenderMatch { get; set; }
public string ContentMatch { get; set; }
public string SenderReplace { get; set; }
public string ContentReplace { get; set; }
}
[Route("/monitoring/matrix/routecontentrules")]
public sealed class RouteContentRulesRequest
{
public int RouteId { get; set; }
}
[Route("/monitoring/matrix/routecontentrules/deleteroutecontentrule")]
public sealed class DeleteRouteContentRuleRequest
{
public int Id { get; set; }
}
public sealed class RouteContentRuleModel
{
public int Id { get; set; }
public int OrderId { get; set; }
public int RouteId { get; set; }
public string SenderMatch { get; set; }
public string ContentMatch { get; set; }
public string SenderReplace { get; set; }
public string ContentReplace { get; set; }
}
获取数据代码如下:
public object Post(RouteContentRulesRequest request)
{
return _dbConnectionFactory
.OpenReadOnlyAndRun(dbConn => dbConn.Select<RouteContentRule>(r => r.RouteId == request.RouteId).OrderBy(r => r.OrderId));
}
public object Any(CreateUpdateRouteContentRuleRequest request)
{
RouteContentRule entity;
if (!Db.Exists<Route>(new { Id = request.RouteId }))
{
throw new HttpError(HttpStatusCode.BadRequest, $"Route with id {request.RouteId} does not exist");
}
if (request.Id != 0)
{
var routeContentRule = _dbConnectionFactory.OpenReadOnlyAndRun(dbConn => dbConn.SingleById<RouteContentRule>(request.Id));
entity = request.ToEntity(routeContentRule);
Db.Update(entity, r => r.Id == routeContentRule.Id);
return entity.ToModel();
}
entity = request.ToEntity();
entity.OrderId = (_dbConnectionFactory.OpenReadOnlyAndRun(dbConn => dbConn.Scalar<RouteContentRule, int?>(x => Sql.Max(x.OrderId), x => x.RouteId == request.RouteId)) ?? 0) + 1;
var id = (int)Db.Insert(entity, true);
entity.Id = id;
return entity.ToModel();
}
public void Delete(DeleteRouteContentRuleRequest request)
{
Db.Delete<RouteContentRule>(new {Id = request.Id});
}
读取请求中的数据如下:
[
{
"Id":35,
"OrderId":1,
"RouteId":72303,
"SenderMatch":"335",
"ContentMatch":"",
"SenderReplace":"",
"ContentReplace":""
},
{
"Id":36,
"OrderId":2,
"RouteId":72303,
"SenderMatch":"55",
"ContentMatch":"",
"SenderReplace":"",
"ContentReplace":""
}
]
以下是来自 Chrome 开发者工具的图像:
问题是网格没有显示这些数据。如果我点击网格单元格,我可以看到数据在这里。在这种情况下,该单元格变为可编辑状态,并显示数据的当前值。但是一旦我将编辑移动到一些新的单元格之前隐藏数据。我正在检查单元格,我发现当单元格未编辑时,它描述如下:
<td style="text-align: right" aria-describedby="50349c08-da61-49d2-aa73-9c0823d4a4a4" role="gridcell">
<span><label class="SenderMatch" <="" label=""></label></span>
</td>
当单元处于edding模式时,html中描述如下:
<td style="text-align: right" aria-describedby="ccc2df23-b49a-4b00-820a-02a67c428a52" role="gridcell" id="Grid_active_cell" class="k-edit-cell" data-role="editable">
<input type="text" class="k-input k-textbox" name="SenderMatch" data-bind="value:SenderMatch">
</td>
我不知道为什么没有显示数据。据我所知,它应该显示数据,但它没有显示这些数据。
为什么要在 class 上添加 [Route]
属性......?它们应该在 Controller
的 Action
.
然后你可以打开Chrome的开发工具,查看network
选项卡,查看数据是否发送到back-end。
你可以把network
的图片贴出来给我们看看你觉得应该拿数据的时候,我们可以看看是什么问题。
我知道问题出在哪里了。
columns: [
{
width: 150, field: "SenderMatch", title: "Sender match",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Sender match", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "ContentMatch", title: "Content match",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Content match", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "SenderReplace", title: "Sender replace",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Sender replace", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
width: 150, field: "ContentReplace", title: "Content replace",
template: "<span><label class='SenderMatch'</label></span>",
headerAttributes: { title: "Content replace", style: "text-align: right" }, attributes: { style: "text-align: right" }
},
{
command: [
{ name: "destroy", template: "<a class='k-button k-grid-delete delete'><span class='k-sprite px-sprite px-i-sm-trash'></span></a>" }
],
width: "50px"
}],
模板有问题。我删除了它们,现在显示了数据。命令模板仍然有效。