[HttpGet("{pageNumber}{pageSize?}{filter?}{sortOrder?}", Name = "GetEntriesPaged")]
public ActionResult<List<Entry>> GetEntriesPaged(
int pageNumber, int pageSize = 10, string filter = "", string sortOrder = "desc") {
运行时异常:
System.ArgumentException:可选参数必须位于 段。在细分中 '{pageNumber} {pageSize?} {filter?} {sortOrder?}',可选参数 “ pageSize”后跟“ filter”。参数名称: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;
}
我需要使用/entries
GetAll()
方法,但是需要/esntries?pageNumber=3
GetEntriesPaged(...)
一个
答案 0 :(得分:5)
不,你不知道。 sortOrder
在结尾,但pageSize
和filter
不是结尾。简而言之,您不能有多个这样的可选参数。它创建了太多的路由组合,这将导致无法确定如何路由请求或要填充的特定路由参数。例如,如果您填写pageSize
和sortOrder
但不填写filter
怎么办? ASP.NET Core应该如何知道您为sortOrder
提供的内容实际上不是为filter
提供的?
FWIW,您还需要在这些路径参数之间使用斜线。否则,就无法知道下一个结点在哪里,下一个结点在哪里开始。例如,是否像/111
这样的路由说第一页的大小为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());
}