对于我正在进行的项目,我们对某个位置的事物执行了操作,因此我们的url模式如下:
locations/{locationId}/{controller}/{action}/{id}
所以我们有这样的行动签名:
public ActionResult TheAction(long locationId, long id)
哪个好。
我的蜘蛛般的感官想要抽象出在行动参数列表中包含locationId
的必要性。有没有办法通过超类或ActionFilter将此值绑定到超类属性?
答案 0 :(得分:1)
最简单的方法是将locationId
路由值添加到每条location
路由。
routes.MapRoute(
name: "location1",
url: "location1/{controller}/{action}/{id}",
defaults: new { locationId = "1", id = UrlParameter.Optional });
routes.MapRoute(
name: "location2",
url: "location2/{controller}/{action}/{id}",
defaults: new { locationId = "2", id = UrlParameter.Optional });
假设您的位置将包含该数字,您可以使用正则表达式路由约束来使其更具动态性:
routes.MapRoute(
name: "location",
url: "location{locationId}/{controller}/{action}/{id}",
defaults: new { id = UrlParameter.Optional },
constraints: new { locationId = @"\d+" });
或者您可以实施IRouteConstraint
以使您的位置完全基于文本而不包含ID,这允许您根据动态数据对其进行映射。
数据库驱动数据的另一个选项是,您可以一次处理多个细分,即创建RouteBase
subclass并将逻辑放在那里。
或者,您可以创建自动生成并添加到路由表的.NET Reflection /逻辑驱动路由,如this example中所示(但请注意,这只应在应用程序启动时完成)。