【问题标题】:ASP.NET MVC 5 catch-all route for undefined parameters未定义参数的 ASP.NET MVC 5 包罗万象的路由
【发布时间】: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


【解决方案1】:

在我的上一个项目中,我遇到了类似的问题。这对我有用。

尝试使用 int?参数除外。

如果不行,使用字符串,然后转成整数。

[HttpGet]
public ActionResult MyFunction(string val)
{
   int n = Convert.ToInt32(val);
   ...logic
}

在使用 PagedList.MVC 实现分页时,我使用了int? page,它没有引发异常。

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2021-04-25
    • 1970-01-01
    • 2011-02-12
    • 2014-04-27
    相关资源
    最近更新 更多