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

ASP.NET Core 2 MVC路由异常:缺参数仍可访问Action问题

解决ASP.NET MVC路由强制参数匹配问题

你的问题核心在于默认路由的匹配范围太宽泛:虽然你把自定义的Home_AddVoucher路由放在了最前面,但当访问不带参数的/Home/AddVoucher时,默认路由{controller=Home}/{action=Index}依然会命中这个请求——因为它只要求controller和action存在,不强制携带任何参数,所以会绕过你定义的严格路由规则,直接调用AddVoucher Action。

下面给你两种不需要手动判断参数的解决方案:

方案1:给默认路由添加Action排除约束

修改默认路由的模板,添加一个正则约束,让它永远不匹配Home控制器下的AddVoucher Action。这样当访问不带参数的/Home/AddVoucher时,没有任何路由能匹配,自然返回404。

修改后的默认路由代码:

routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index:regex(^(?!AddVoucher$).*)}"
);

这里的正则^(?!AddVoucher$).*是负向预查,意思是:只匹配不是AddVoucher的Action名称,彻底把这个Action从默认路由的匹配范围里排除。

方案2:改用属性路由(更推荐)

直接在AddVoucher Action上标注属性路由,这种方式优先级高于全局路由,能精准控制只有完全符合模板的URL才能访问该Action,彻底避免全局路由的干扰。

修改你的Controller代码:

[Route("Home/AddVoucher/{id:int}/{price:decimal}/{from:regex(^\\d\\d-\\d{2}-\\d{4}$)}/{to}/{passengers:range(1, 9)}")]
public async Task<IActionResult> AddVoucher(int id, double price, DateTime from, string to, int passengers)
{
    AddVaucherModel addVaucherModel = new AddVaucherModel();
    return View(addVaucherModel);
}

之后你可以删掉全局路由里的Home_AddVoucher配置,因为属性路由已经完全接管了这个Action的路由规则。此时任何不符合模板的请求(比如不带参数的/Home/AddVoucher)都会直接返回404,完全符合你的需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:07:13