C# ASP.NET Core 3.1 OData页面结果序列化
通过C# ASP.NET Core 3.1 OData页面结果序列化,c#,asp.net-core,odata,system.text.json,C#,Asp.net Core,Odata,System.text.json,通过System.Text.Json(ASP.NET Core 3默认值)对以下结果进行序列化时,PageResult响应缺少nextPageLink和count值: [ApiController] [路由(“api/[控制器]”)] 公共类值控制器:控制器库 { [HttpGet] public IActionResult Get() { 变量项=新列表{“值”}; var pageResult=new Microsoft.AspNet.OData.pageResult(项目,新Uri(“ht
System.Text.Json
(ASP.NET Core 3默认值)对以下结果进行序列化时,PageResult
响应缺少nextPageLink
和count
值:
[ApiController]
[路由(“api/[控制器]”)]
公共类值控制器:控制器库
{
[HttpGet]
public IActionResult Get()
{
变量项=新列表{“值”};
var pageResult=new Microsoft.AspNet.OData.pageResult(项目,新Uri(“http://localhost/foo)项目数);
返回Ok(pageResult);
}
}
但是,当我使用时,结果是正确的:
public void配置服务(IServiceCollection服务)
{
services.AddControllers().AddNewtonsoftJson();
}
结果为System.Text.Json
:
[
"value"
]
{
"items": [
"value"
],
"nextPageLink": "http://localhost/foo",
"count": 1
}
结果为Newtonsoft.Json
:
[
"value"
]
{
"items": [
"value"
],
"nextPageLink": "http://localhost/foo",
"count": 1
}
知道这种行为的原因吗?在重读问题时,这并不能直接回答OP的问题,即为什么一个格式化程序和另一个格式化程序会导致正确的输出,但可能会为OP提供一些开始查找的位置 在使用OData和Asp.NETCore时,我也看到了一些有趣的行为,从在线文档中很难理解您这些天应该做什么,因为大多数文档似乎已经过时或OData的早期版本。例如,您将在某些文档中看到对GetInlineCount()的一些引用,但它似乎已从API中删除 对于你的问题,我认为你有两个选择 首先,将您的退货类型更改为IQueryable 指定属性
[EnableQuery(PageSize=10)]
或者,保留现有内容,并使用PageResult
对象:
返回新的PageResult(对象列表,如IEnumerable、Request.GetNextPageLink(5)、Request.ODataFeature().TotalCount)代码>
通过如下设置Request.ODataFeature().TotalCountFunc函数,可以解决Request.ODataFeature().TotalCountFunc不返回值的问题
Request.ODataFeature()代码>[ApiController]
[路由(“api/[控制器]”)]
公共类值控制器:ODataController
{
[HttpGet]
[启用查询(页面大小=5)]
public IActionResult Get()
{
变量项=新列表{“value1”、“value2”、“value3”、“value4”、“value5”};
返回Ok(项目);
}
}
使用ODataController
而不是ControllerBase
扩展控制器<代码>[EnableQuery]
属性需要添加到方法中。如果您正在进行服务器端分页,则可以定义PageSize
。感谢您的建议,不幸的是,两者的结果相同。我相信医生们最终会赶上的,但我感觉到了你的痛苦。我现在认为这实际上可能是System.Text.Json
格式化程序的一个问题……不幸的是,这仍然没有给我想要的响应。我已经用示例回答更新了问题。