ASP.NET Core,以查询字符串为模板的 Web API RouteAttribute
Posted
技术标签:
【中文标题】ASP.NET Core,以查询字符串为模板的 Web API RouteAttribute【英文标题】:ASP.NET Core, Web API RouteAttribute with query string as template 【发布时间】:2016-08-16 14:57:52 【问题描述】:我需要创建一个支持多个HttpGet
动词的ASP.NET Core, Web API
,唯一的区别是查询字符串,但查询字符串似乎不能成为路由模板的一部分——这是真的吗?
路由模板非常相似,实际上它们只是查询字符串不同。
[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);
这会引发异常,因为 ?
不是路由模板中的有效字符。我怎样才能做到这一点?
【问题讨论】:
【参考方案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);
【讨论】:
您可以将 [FromUri] 用于复杂对象。【参考方案2】://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);
【讨论】:
以上是关于ASP.NET Core,以查询字符串为模板的 Web API RouteAttribute的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ASP.NET Core 将查询字符串参数转换为看起来像目录部分?
选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?
在 ASP.NET Core 中将 Razor 视图渲染为字符串
使用将 net461 设置为唯一框架的 ASP.NET Core Web 应用程序 (.NET Core) 与使用 (.NET Framework) 模板之间的区别
Visual Studio 2019 ASP.NET Core API 项目模板损坏?
为 ASP.NET Core 5.0 - EF Core 5.0 Web App 配置 PostgreSQL 连接字符串以在 MS 或 Linux 云上运行?