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

区域路由与HttpGet特性修饰的特定动作路由失效问题

原因分析

当你给UpdateProduct方法添加[HttpGet("{id:int:min(1)}")]时,属性路由规则会优先于全局配置的传统路由生效。该属性路由的模板"{id:int:min(1)}"仅定义了id参数的匹配规则,未包含action部分,因此它期望的URL格式是:
https://localhost:7207/Product/Products/1
而你实际访问的https://localhost:7207/Product/Products/UpdateProduct/1中多了UpdateProduct这个action名称,与属性路由模板不匹配,最终触发404错误。

移除该属性路由后,全局配置的areaRoute传统路由会生效,其模板"{area:exists}/{controller}/{action}/{id?}"完全匹配你访问的URL结构,因此可以正常响应。

解决方案

要保留参数验证并让URL正常访问,可选择以下两种方案:

  1. 调整属性路由模板,包含action名称
    修改HttpGet特性的模板,明确指定action部分,使其与目标URL结构匹配:
[HttpGet("UpdateProduct/{id:int:min(1)}")]
public async Task<ActionResult> UpdateProduct(int id)
{
    // 业务处理逻辑...
    return PartialView("Update", product);
}

此方案既保留了id的整数及最小值验证,又让属性路由与你访问的URL完全对应。

  1. 保留传统路由,改用数据注解做参数验证
    移除[HttpGet("{id:int:min(1)}")],使用[Range]数据注解实现参数验证:
public async Task<ActionResult> UpdateProduct([Range(1, int.MaxValue)] int id)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState); // 处理验证失败逻辑
    }
    // 业务处理逻辑...
    return PartialView("Update", product);
}

该方案依赖全局传统路由匹配,同时通过数据注解完成参数最小值验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:17