MVC属性路由中int参数为0时返回404的问题求助
解决MVC属性路由中ticketId为0时返回404的问题
我之前也碰到过一模一样的路由约束坑,咱们来快速搞定它:
问题根源
你在路由前缀里写的{ticketId:int}用了MVC默认的整数约束,而这个默认约束只认大于0的正整数。所以当ticketId=0时,路由系统会直接判定请求不匹配任何规则,返回404错误。
解决方案
只需要调整路由约束,让它允许0值就行,这里有两种实用的实现方式:
方式1:修改全局路由前缀的约束
直接在int约束后面追加:min(0),明确告诉路由系统接受最小值为0的整数:
[Authorize] [RouteArea("Work", AreaPrefix = "")] // 把{ticketId:int}改成{ticketId:int:min(0)} [RoutePrefix("Company/{companyId:int}/Client/{clientId:int}/Ticket/{ticketId:int:min(0)}")] public class TimeController : Controller { private ApplicationDbContext db = new ApplicationDbContext(); [Route("Time")] public ActionResult Index(int ticketId, int clientId, int companyId) { if (ticketId == 0) { var work = db.Time.Include(...); // 你的业务逻辑代码 // 后续处理逻辑 } // 其他业务分支 } }
方式2:为单个Action单独配置路由(适合不想修改全局前缀的场景)
如果路由前缀下还有其他Action依赖默认的正整数约束,可以给Index方法单独加一个允许0值的路由规则:
[Authorize] [RouteArea("Work", AreaPrefix = "")] [RoutePrefix("Company/{companyId:int}/Client/{clientId:int}/Ticket/{ticketId:int}")] public class TimeController : Controller { private ApplicationDbContext db = new ApplicationDbContext(); // 同时保留原路由和允许0值的路由 [Route("Time")] [Route("Time/{ticketId:int:min(0)}")] public ActionResult Index(int ticketId, int clientId, int companyId) { if (ticketId == 0) { var work = db.Time.Include(...); // 你的业务逻辑代码 // 后续处理逻辑 } // 其他业务分支 } }
验证效果
修改完成后,再请求类似/Company/1/Client/2/Ticket/0/Time的URL,路由系统就能正确匹配到Index方法,你写的ticketId==0的判断逻辑也能正常执行了。
内容的提问来源于stack exchange,提问作者YipKyAy
相关产品推荐
相关产品推荐

