需要ASP.NET MVC Route Id参数

时间:2016-07-02 15:37:36

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

我有这条路线:

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 - 并要求我处理它。

如果路由本身实现了这一点,而不是在控制器本身中需要不合理的空检查,那似乎更为简洁。

我在谷歌没有发现有关此特定问题的任何内容。

我该怎么做?

2 个答案:

答案 0 :(得分:6)

要使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?

答案 1 :(得分: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操作