gpt4 book ai didi

c# - .NET Core Web API 路由模板中的可选参数

转载 作者:行者123 更新时间:2023-12-02 05:39:03 35 4
gpt4 key购买 nike

[HttpGet("{pageNumber}{pageSize?}{filter?}{sortOrder?}", Name = "GetEntriesPaged")]
public ActionResult<List<Entry>> GetEntriesPaged(
int pageNumber, int pageSize = 10, string filter = "", string sortOrder = "desc") {

运行时异常:

System.ArgumentException: An optional parameter must be at the end of the segment. In the segment '{pageNumber}{pageSize?}{filter?}{sortOrder?}', optional parameter 'pageSize' is followed by 'filter'. Parameter name: routeTemplate

重点是什么?按照要求,我在该段的末尾有一个可选参数......

PS。更完整的代码:

[HttpGet]
public ActionResult<List<Entry>> GetAll() {
var result = _db.Entries.OrderByDescending(x => x.Date).ToList();
return result;
}

[HttpGet("{pageNumber}{pageSize?}{filter?}{sortOrder?}", Name = "GetEntriesPaged")]
public ActionResult<List<Entry>> GetEntriesPaged(int pageNumber = 1, int pageSize = 10, string filter = "", string sortOrder = "desc") {
int take = pageSize;
int skip = ((pageNumber - 1) * pageSize);
IQueryable<Entry> result;

if (sortOrder == "asc") {
result = _db.Entries.OrderBy(x => x.Date);
}
else {
result = _db.Entries.OrderByDescending(x => x.Date);
}

return result.Skip(skip).Take(take).Where(x => x.Origin.Contains(filter)).ToList();
}

[HttpGet("{id}", Name = "GetEntry")]
public ActionResult<Entry> GetById(long id) {
var item = _db.Entries.Find(id);
if (item == null) {
return NotFound();
}
return item;
}

我需要使用 /entriesGetAll() 方法,但使用 /esntries?pageNumber=3 GetEntriesPaged(...) 一个

最佳答案

不,你不知道。 sortOrder 位于末尾,但 pageSizefilter 不在末尾。简而言之,您不能有多个这样的可选参数。它创建了太多的路由组合,这将导致无法确定如何路由请求或要填充哪些特定路由参数。例如,如果您填写了 pageSizesortOrder 但没有填写 filter 会怎样? ASP.NET Core 如何知道您为 sortOrder 提供的内容实际上并非用于 filter

FWIW,您还需要在这些路由参数之间添加斜杠。否则,就无法知道一个在哪里结束,下一个从哪里开始。例如,像 /111 这样的路由是否表示第 1 页的大小为 11,第 11 页的大小为 1,或者第 111 页,但未设置大小?但这仍然无法帮助您让它们全部成为可选。

如果您需要在 URL 中包含多个可选内容,最好只使用查询字符串来提供它们。

更新

您不需要也不应该对分页或不分页执行多个操作。通用功能太多,差异太小。典型的公式为:

public async Task<IActionResult> GetAll(int? page = null, int pageSize = 10)
{
var query = _context.Foos;
if (page.HasValue)
{
query = query.Skip((page.Value - 1) * pageSize).Take(pageSize);
}

return Ok(await query.ToListAsync());
}

关于c# - .NET Core Web API 路由模板中的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52387826/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com