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
相关产品推荐
相关产品推荐

