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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:24:23