我有这条路线:
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 - 并要求我处理它。
如果路由本身实现了这一点,而不是在控制器本身中需要不合理的空检查,那似乎更为简洁。
我在谷歌没有发现有关此特定问题的任何内容。
我该怎么做?
答案 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
操作