3

我需要制作一个支持多个HttpGet动词的ASP.NET Core, Web API,唯一的区别是查询字符串,但似乎查询字符串不能成为路由模板的一部分 - - 真的吗?ASP.NET Core,Web API RouteAttribute,查询字符串作为模板

路由模板非常相似,实际上它们只是根据查询字符串而不同。

[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); 
   } 
} 

由于?不是路由模板中的有效字符,所以会引发异常。我怎样才能做到这一点?

回答

4

我想出了一个更简单,更直接的解决方案。我只是使用FromQuery属性并简化了模板。我检查是否存在id变量并相应地处理它。

[HttpGet, Route("api/symbols")] 
public Task<IEnumerable<Symbol>> Symbols(
    [FromQuery] Guid id, 
    [FromServices] ISymbolService symbolService) 
{ 
    return id == default(Guid) 
       ? symbolService.GetSymbolsAsync() 
       : symbolService.GetValidChildrenAsync(id); 
} 
+0

您可以使用[FromUri]作为复杂对象。 –

1
//eg GET api/symbols 
//eg GET api/symbols?childrenOf={someGuid} 
[HttpGet("api/symbols")] 
public Task<IEnumerable<Symbol>> Symbols(
    [FromServices] ISymbolService symbolService, 
    Guid? childrenOf = null) 
{ 
    if (childredOf.HasValue) { 
     return ValidChildren(childredOf.Value, symbolService); 
    } 
    return symbolService.GetSymbolsAsync(); 
} 

Task<IEnumerable<Symbol>> ValidChildren(
    Guid id, 
    ISymbolService symbolService) 
{ 
    return symbolService.GetValidChildrenAsync(id); 
}