You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core API动态路由实现:将查询参数转为路径变量

实现ASP.NET Core API动态路由绑定,替换查询字符串为路径参数

没问题,这事儿其实非常好实现,刚好契合你提到的RESTful设计原则,我给你拆解清楚:

你的思路完全正确,只需要对控制器的路由和方法参数做一点点调整就能达到目标,而且完美适配你数百种文档类型的需求,不用逐个创建API路径。

最终实现代码

namespace DocumentGenerator.Api.Controllers
{
    [Route("api/{controller}")]
    [ApiController]
    public class DocumentsController : ControllerBase
    {
        // 这里注入你的服务、依赖等细节...
        
        [HttpPost("{templateName}")]
        public async Task<IActionResult> Generate([FromRoute] string templateName, [FromBody] object properties)
        {
            // 直接使用templateName变量执行你的业务逻辑,比如匹配对应模板
            // 你的文档生成代码...
            
            return Ok();
        }
    }
}

关键变化说明

  • 路由调整:把原来的[HttpPost]改成[HttpPost("{templateName}")],这个路由模板会自动把api/documents/之后的任意非斜杠字符串绑定到templateName参数上,完美覆盖你所有文档类型的需求。
  • 参数绑定:移除了原来的[FromQuery],换成[FromRoute](虽然ASP.NET Core默认会自动绑定路由参数,但显式标注让代码可读性更强),这样templateName就会从URL路径中获取,而不是查询字符串。
  • RESTful合规性:这种设计完全符合REST规范,用路径参数标识你要操作的特定资源(文档模板),查询字符串则留给真正的查询、过滤场景使用。

额外提示

如果你的templateName需要包含特殊字符(比如中文、空格),ASP.NET Core默认支持,只需要客户端在请求时对URL进行正确编码即可(比如空格转成%20)。如果需要允许templateName包含斜杠,可以把路由模板改成[HttpPost("{templateName*}")],不过一般不建议这么做,因为会破坏REST路径的层级语义。

现在你就可以通过POST http://localhost:5000/api/documents/individualemploymentagreement这样的URL来调用接口,请求体传入properties数据,接口就能正确获取到templateName了。

内容的提问来源于stack exchange,提问作者FMR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:37:40