区域路由与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正常访问,可选择以下两种方案:
- 调整属性路由模板,包含action名称
修改HttpGet特性的模板,明确指定action部分,使其与目标URL结构匹配:
[HttpGet("UpdateProduct/{id:int:min(1)}")] public async Task<ActionResult> UpdateProduct(int id) { // 业务处理逻辑... return PartialView("Update", product); }
此方案既保留了id的整数及最小值验证,又让属性路由与你访问的URL完全对应。
- 保留传统路由,改用数据注解做参数验证
移除[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
相关产品推荐
相关产品推荐

