我无法让我的网格呈现它正在检索的数据。我的控制器中有以下代码,并通过查看浏览器中的网络选项卡来验证它是否返回:
[HttpPost, HttpGet]
public ActionResult SavedSettings_Read([DataSourceRequest] DataSourceRequest request)
{
var ret = DBFunctions.SavedStringInfos.ToDataSourceResult(request);
//return Json( ret); made everything lowercase?
return JsonConvert.SerializeObject(ret);//newtonsoft
}
我的网格是这样定义的:
Html.Kendo().Grid<SavedStringInfo>()
.Name("grid")
.Pageable()
.Sortable()
.Filterable()
.Scrollable()
.Editable(editable => editable.Mode(GridEditMode.InLine))
.DataSource(data =>
{
data.Ajax()
.PageSize(20)
.Model(x => x.Id(p => p.IPAddress))
.Create("SavedSettings_Create", "Home")
.Read("SavedSettings_Read", "Home")
.Update("SavedSettings_Update", "Home")
.Destroy("SavedSettings_Destroy", "Home");
})
.HtmlAttributes(new { style = "height:430px;" })
.ToolBar(t => t.Create().Text("Add New Device(s)"))
.Columns( columns =>
{
columns.Command(x => { x.Edit(); x.Destroy(); });
columns.Bound(m => m.StreamTo).Title("Stream To").Width(120);
columns.Bound(m => m.StringName).Title("String Name").Width(200);
columns.Group(g =>
{
g.Title("Channels");
g.Columns(gc =>
{
gc.Bound(m => m.StartChannel).Title("Start").Width(100);
gc.Bound(m => m.EndChannel).Title("End").Width(100);
});
});
columns.Bound(m => m.DisableFrameLimiter).Title("DFL").Width(100);
columns.Bound(m => m.IPAddress).Title("IP Address").Width(160);
columns.Bound(m => m.MacAddress).Title("MAC Address)").Width(160);
columns.Group(g =>
{
g.Title("Aspect Ratio");
g.Columns(gc =>
{
gc.Bound(m => m.XYAspectRatio).Title("XY").Width(100);
gc.Bound(m => m.XZAspectRatio).Title("XZ").Width(100);
});
});
})
)
我还通过以下方式验证了网格的数据源实际上是空的: $("#grid").data("kendoGrid")._data 也 $("#grid").data("kendoGrid").dataItems() 并检查树。
我显然错过了一个重要的设置,但我不知道是什么。 这是返回的 json(在 fiddler 中捕获)
{
"Data": [
{
"ID": 1,
"StringName": "Line in bedroom",
"StartChannel": 1,
"IPAddress": "192.168.4.166",
"MacAddress": "a8:03:2a:3e:76:95",
"StreamTo": true,
"XYAspectRatio": 0.8,
"XZAspectRatio": 0,
"DisableFrameLimiter": true
},
{
"ID": 2,
"StringName": "Right poles",
"StartChannel": 1,
"IPAddress": "192.168.4.36",
"MacAddress": "a4:e5:7c:c4:75:01",
"StreamTo": true,
"XYAspectRatio": 0.45455,
"XZAspectRatio": 11.36364,
"DisableFrameLimiter": true
},
{
"ID": 3,
"StringName": "Left poles",
"StartChannel": 1,
"IPAddress": "192.168.4.37",
"MacAddress": "a4:e5:7c:5e:6f:f9",
"StreamTo": true,
"XYAspectRatio": 0.5,
"XZAspectRatio": 11.36364,
"DisableFrameLimiter": true
}
],
"Total": 3,
"AggregateResults": null,
"Errors": null
}
有什么想法吗?
如果有人可以插话并解释为什么这解决了我的问题,我会改变我接受的答案。 在我的 Program.cs 中,您可以在其中配置 Web 应用程序生成器,我向 NewtonSoft 添加了一个配置参数以供使用
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddKendo();
builder.Services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
{
options.UseMemberCasing();
}
);
var app = builder.Build();
然后,我对我的控制器进行了以下更改
public ActionResult<string> SavedSettings_Read([DataSourceRequest] DataSourceRequest request)
{
var ret = DBFunctions.SavedStringInfos.ToDataSourceResult(request);
return Json(ret);
}
现在,眼尖的人可能明白为什么这让我感到困惑。 Json 不属于 NewtonSoft,并且序列化对象调用不适用于 Program.cs 中的更改,并且需要两个更改才能解决此问题。如果有人可以解释为什么这会修复它,请指向您。在那之前,我希望这能帮助其他被困的人。