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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:45:39