Необязательный параметр в шаблоне маршрута .NET Core Web API - PullRequest
0 голосов
/ 18 сентября 2018
[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(...) one

1 Ответ

0 голосов
/ 18 сентября 2018

Нет, ты не.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());
}
...