ASP.NET Core, RouteAttribute веб-API со строкой запроса в качестве шаблона

Мне нужно сделать ASP.NET Core, Web API, который поддерживает несколько глаголов HttpGet, с той лишь разницей, что это строка запроса, но кажется, что строки запроса не могут быть частью шаблона маршрута - это правда?

Шаблоны маршрутов очень похожи, фактически они отличаются только строкой запроса.

[Authorize]
public class SymbolsController : Controller
{
    [
        HttpGet, 
        Route("api/symbols")
    ]
    public Task<IEnumerable<Symbol>> Symbols([FromServices] ISymbolService symbolService)
    {
        return symbolService.GetSymbolsAsync();
    }

    [
        HttpGet, 
        Route("api/symbols?{childrenOf=id}")
    ]
    public Task<IEnumerable<Symbol>> ValidChildren(
        [FromQuery] Guid id, 
        [FromServices] ISymbolService symbolService)
    {
        return symbolService.GetValidChildrenAsync(id);
    }
}

Это вызывает исключение, поскольку ? не является допустимым символом в шаблоне маршрута. Как я могу этого добиться?


person David Pine    schedule 16.08.2016    source источник


Ответы (1)


Я нашел более простое и понятное решение. Я просто использую атрибут FromQuery и оставляю шаблон простым. Я проверяю наличие переменной id и обрабатываю ее соответствующим образом.

[HttpGet, Route("api/symbols")]
public Task<IEnumerable<Symbol>> Symbols(
    [FromQuery] Guid id, 
    [FromServices] ISymbolService symbolService) => 
    id == default
        ? symbolService.GetSymbolsAsync()
        : symbolService.GetValidChildrenAsync(id);
person David Pine    schedule 16.08.2016
comment
вы можете использовать [FromUri] для сложного объекта. - person Nicolas Law-Dune; 17.08.2016