c# - 未定义参数的 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
?
解决方案
在我的上一个项目中,我遇到了类似的问题。这对我有用。
尝试使用int?参数除外。
如果它不起作用,请使用字符串,然后将其转换为整数。
[HttpGet]
public ActionResult MyFunction(string val)
{
int n = Convert.ToInt32(val);
...logic
}
在使用 PagedList.MVC 实现分页时,我使用int? page
了它并没有引发异常。
推荐阅读
- angular - Angular:组件内包含的模态窗口渲染
- apache-spark - Pyspark - 当列包含特定字符串时如何对列求和
- java - JPA 符合条件的前一行
- lamp - Bitnami LAMP 堆栈 .htmaccess 不工作
- c# - Automapper 忽略 null 值,但将空字符串映射到 null
- regex - 在 Hive 中用空替换单引号(')
- android - 如何发送 Zebra GX420d 打印机以使用 Dart 进行打印,或者如何配置 Android 的 IP?
- dart - 如何让 Dart 测试加载主文件?
- asp.net - .NET 代码在 IIS 超时响应后是否继续执行?
- c# - 我有@html.actionlink 在 mvc 中不起作用的问题