ASP.NET Core中如何配置子文件夹下视图与控制器的路由?
解决ASP.NET Core路由与控制器文件夹结构匹配问题
正确的路由配置方式
首先确保你的控制器类符合ASP.NET Core命名约定(类名以Controller结尾),通过控制器级别的Route属性统一设置前缀,再结合Action的Route属性拼接完整路径,这样既清晰又便于维护:
1. 控制器类的路由配置
在Controllers/CaseConverters文件夹下创建控制器(比如LowerCaseConverterController.cs),在类上添加路由前缀:
// Controllers/CaseConverters/LowerCaseConverterController.cs [Route("CaseConverters")] public class LowerCaseConverterController : Controller { [HttpPost] [Route("lower-case-converter")] public IActionResult Index(BassModel model) { // 业务逻辑代码 // 默认视图路径:Views/CaseConverters/LowerCaseConverter/Index.cshtml return View(); } }
配置完成后,该Action的完整路由为CaseConverters/lower-case-converter,发送POST请求到这个路径即可触发方法。
2. 视图路径匹配
你已在Views下创建CaseConverters文件夹,需要在其中再创建与控制器名称对应的子文件夹(比如LowerCaseConverter),将Index.cshtml放入该子文件夹。若不想创建控制器名称的子文件夹,可在返回视图时指定绝对路径:
return View("~/Views/CaseConverters/Index.cshtml");
排查之前配置无效的原因
你之前使用[Route("~/CaseConverters/lower-case-converter")]或[Route("/CaseConverters/lower-case-converter")]理论上是有效的,可能的问题点:
- 控制器命名不符合约定:类名未以
Controller结尾,框架无法识别为控制器(比如写成LowerCaseConverter而非LowerCaseConverterController) - 请求方法不匹配:Action标注了
[HttpPost],但使用GET方法访问,会返回404 - 视图路径错误:视图文件不存在或路径不正确,导致返回500错误,误以为路由无效
- 路由冲突:其他控制器的路由与该路径重复,导致请求被分流
验证路由是否注册成功
可以通过ASP.NET Core的端点调试功能确认路由是否正确注册:
- 在
Program.cs的开发环境配置中添加端点调试接口:
if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapGet("/routes", async context => { var endpointDataSource = context.RequestServices.GetRequiredService<EndpointDataSource>(); var routes = endpointDataSource.Endpoints .OfType<RouteEndpoint>() .Select(e => new { Route = e.RoutePattern.RawText }) .ToList(); await context.Response.WriteAsJsonAsync(routes); }); }); }
- 启动项目后访问
/routes,查看返回的路由列表中是否包含CaseConverters/lower-case-converter。
内容的提问来源于stack exchange,提问作者Prageeth Liyanage
相关产品推荐
相关产品推荐

