首页 > 解决方案 > 未定义参数的 ASP.NET MVC 5 包罗万象的路由

问题描述

我有一个带有可选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);
}

问题是,在这个大型 Web 应用程序中,有时一些错误的代码会将用户引导到没有 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 页面。我看到的问题为未知的控制器或动作提供了解决方案,但不是默认路由定义为可选的参数,而是动作方法根据需要定义。

我尝试在默认路由之前添加我的“catchall”路由,id 的值为 0:

routes.MapRoute(
  name: "CatchAll",
  url: "{controller}/{action}",
  defaults: new { controller = "Home", action = "Index", id = 0 },
);

这可以防止异常,但我想显示 404 错误页面。有没有办法在路由配置中执行此操作,而不是将每个操作方法更改为期望int? id然后重定向到 404 页面 if !id.HasValue

标签: c#asp.net-mvcroutesasp.net-mvc-5

解决方案


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

尝试使用int?参数除外。

如果它不起作用,请使用字符串,然后将其转换为整数。

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

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


推荐阅读