使 ASP.NET 需要 MVC 路由 ID 参数

Make ASP.NET MVC Route Id parameter required

我有这条路线:

routes.MapRoute(
            "PlaceDetails",
            "{controller}/{action}/{id}",
            new { controller = "Place", action = "Details", id = UrlParameter.Optional }
        );

这条路线很好: 我的网站.com/place/details/123

使 ID 123 可用于地点控制器的详细操作 - 然后可以查找地点“123”。

但是 - 这个 URL 也传递给了控制器: 我的网站.com/place/details/

我想 return HttpNotFound - 但它向控制器发送了一个空 ID - 需要我来处理。

如果路由本身实现了这一点,而不是需要在控制器本身中进行不合时宜的空检查,这似乎会更整洁。

我在 Google 中没有找到关于此特定问题的任何内容。

我该怎么做?

删除默认值中 id 占位符的可选内容

routes.MapRoute(
        "PlaceDetails",
        "{controller}/{action}/{id}",
        new { controller = "Place", action = "Details"}
    );

现在mysite.com/place/details/将不匹配路线。如果您没有映射其他默认路由。

如果以上导致和你的路由冲突可以这样修改

routes.MapRoute(
        "PlaceDetails",
        "Place/Details/{id}",
        new { controller = "Place", action = "Details"}
    );

将此映射直接耦合到 PlaceController.Details 操作

要使 id 值成为必需值,您不得将其设置为 UrlParameter.Optional 或提供任何其他默认值。 URL 段中没有值,也没有默认值,路由将不匹配请求。

routes.MapRoute(
    "PlaceDetails",
    "{controller}/{action}/{id}",
    new { controller = "Place", action = "Details" }
);

但您可能还需要以另一种方式约束路由,以防止它在不应该匹配的情况下匹配。

routes.MapRoute(
    "PlaceDetails",
    "Place/{action}/{id}",
    new { controller = "Place", action = "Details" }
);

有关详细信息和其他选项,请参阅