【问题标题】:Make ASP.NET MVC Route Id parameter required使 ASP.NET MVC Route Id 参数成为必需
【发布时间】:2016-11-04 19:57:25
【问题描述】:

我有这条路线:

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

这条路线很好: mysite.com/place/details/123

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

但是 - 此 URL 也会传递给控制器​​: mysite.com/place/details/

我希望它返回 HttpNotFound - 但它会向控制器发送一个空 Id - 并且需要我来处理它。

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

我在 Google 中没有发现任何关于此特定问题的信息。

我该怎么做?

【问题讨论】:

  • 作为参考,我现在只使用属性路由 - 更多的控制,更容易让你头脑清醒。

标签: c# asp.net-mvc asp.net-mvc-routing asp.net-routing


【解决方案1】:

要使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" }
);

有关详细信息和其他选项,请参阅 Why map special routes first before common routes in asp.net mvc?

【讨论】:

    【解决方案2】:

    删除默认值中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 操作

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 2019-10-01
      • 2019-11-19
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多