ASP.NET MVC路由自动Slugify:如何将路由参数中的空格自动转为下划线
路由参数空格转下划线解决方案
下面提供3种可落地的实现方案,你可以根据自己的业务场景选择:
方案1:单接口快速处理(推荐仅单接口有需求时使用)
直接在Action方法入口处替换参数中的空格为下划线即可,无需修改其他全局配置,改动最小:
[Route("VerseExkurs/Technologien/{technologie}")] public async Task<ActionResult> Details(string technologie) { // 新增这一行即可完成转换 technologie = technologie?.Replace(" ", "_") ?? string.Empty; TechnologieRootobject TechnologieInfo = new TechnologieRootobject(); // 后续原有逻辑保持不变... }
方案2:自定义路由参数转换器(推荐多接口有相同需求时使用)
通过ASP.NET Core内置的参数转换能力实现全局/指定参数自动转换,不需要每个Action单独写替换逻辑:
- 首先创建自定义参数转换器类
using Microsoft.AspNetCore.Routing; public class SpaceToUnderlineTransformer : IParameterTransformer { public string Transform(object value) { if (value is string strVal) { return strVal.Replace(" ", "_"); } return value?.ToString() ?? string.Empty; } }
- 在项目启动配置中注册转换器(.NET 6+ 写在Program.cs中,.NET 5及更早写在Startup.cs的ConfigureServices方法中)
builder.Services.AddRouting(options => { // 注册转换器别名,后续可以直接在路由约束中使用 options.ConstraintMap.Add("spaceToUnderline", typeof(SpaceToUnderlineTransformer)); });
- 修改路由属性,给需要转换的参数加上对应约束即可
// 加上:spaceToUnderline约束后该参数会自动完成空格转下划线 [Route("VerseExkurs/Technologien/{technologie:spaceToUnderline}")] public async Task<ActionResult> Details(string technologie) { // 此处拿到的technologie已经是空格替换为下划线后的结果 // 原有逻辑保持不变... }
额外优化提示
你现有代码中调用Res.Content.ReadAsStringAsync().Result使用了同步阻塞调用,在async方法中存在死锁风险,建议修改为异步等待:
// 原代码:var TechnologieResponse = Res.Content.ReadAsStringAsync().Result; // 修改为: var TechnologieResponse = await Res.Content.ReadAsStringAsync();
内容的提问来源于stack exchange,提问作者Blizii
相关产品推荐
相关产品推荐

