Kentico 13 .NET Core MVC路由参数配置问题求助
问题分析与解决方案
匹配失败原因
你配置的默认路由{controller}/{action}/{id?}是三段式结构,仅能解析控制器名/动作名/可选id的URL格式。但你访问的/home/our-villages/property/100是四段路径,默认路由会把home识别为控制器、our-villages识别为动作名,剩余的property/100无法匹配路由规则中的id占位符,因此返回404。
而不带参数的/home/our-villages/property能命中方法,说明你的控制器方法应该使用了属性路由(比如[Route("home/our-villages/property")]),属性路由优先级高于默认路由,所以不带参数的URL能匹配成功,但带参数的URL没有对应的属性路由规则。
解决方案
方案一:修改属性路由,添加参数占位符
如果你的方法依赖属性路由,直接在路由特性中加入id参数的占位符即可:
[Route("home/our-villages/property/{id}")] public async Task<ActionResult> Index(int id) { // 方法逻辑 }
如果需要同时支持带参数和不带参数(注意:当前方法中id是必填的int类型,不带参数会触发模型绑定失败,建议将id改为int?或者新增无参数重载),可以把占位符设为可选:
[Route("home/our-villages/property/{id?}")] public async Task<ActionResult> Index(int? id) { // 方法逻辑 }
方案二:调整默认路由,适配多段动作路径
如果不想使用属性路由,可以修改默认路由的模式,让动作部分支持多段路径:
endpoints.MapControllerRoute( name: "Default", pattern: "{controller}/{action*}/{id?}" );
这里的{action*}是捕获所有占位符,会把our-villages/property整体识别为动作名。此时需要确保控制器方法名符合路由的命名映射:
- 要么将方法名改为
OurVillagesProperty(ASP.NET Core路由会自动把URL中的连字符转换为PascalCase格式的方法名) - 要么给方法添加
[ActionName("our-villages/property")]特性指定动作名:[ActionName("our-villages/property")] public async Task<ActionResult> Index(int id) { // 方法逻辑 }
内容的提问来源于stack exchange,提问作者chamara
相关产品推荐
相关产品推荐

