【发布时间】:2021-08-25 14:38:21
【问题描述】:
我有一个默认路由,其中包含一个可选的id 参数,它与许多控制器方法相匹配,这是理想的。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
);
大多数控制器将 id 参数定义为 int 而不是可为空的 int。例如:
public ActionResult Detail(int id)
{
var model = GetModel(id);
return View(model);
}
问题在于,在这个大型网络应用程序中,有时一些错误代码会将用户引导到没有 id 的路径。例如,/ControllerName/Detail。调用了默认路由,但由于缺少参数而记录了异常:
System.ArgumentException: The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Detail(Int32)'
首先会努力找出为什么会发生这样的请求,但我也想避免记录异常,并显示 404 页面而不是 500 页面。我看到的问题为未知的控制器或操作提供了solutions,但不是默认路由定义为可选的参数,而是操作方法根据需要定义。
我尝试在默认路由之前添加我的“catchall”路由,id 的值为 0:
routes.MapRoute(
name: "CatchAll",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index", id = 0 },
);
这可以防止异常,但我想显示 404 错误页面。有没有办法在路由配置中执行此操作,而不是更改每个操作方法以期望 int? id,然后在 !id.HasValue 时重定向到 404 页面?
【问题讨论】:
-
另外,您可以编写一个 HTTP 请求过滤器(例如,“CheckNonZeroId”),如果 id 为零或为空,您可以在过滤器中引发 404。您可以将此过滤器粘贴在要检查 id 的操作或控制器上。在路由级别检查 id 可以阻止显示“/Help”、“/Contact”、“/Error”等页面。
标签: c# asp.net-mvc routes asp.net-mvc-5