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