C# URL前缀中的全局操作参数

C# URL前缀中的全局操作参数,c#,asp.net-mvc,C#,Asp.net Mvc,对于我正在进行的项目,我们在某个位置执行了一些操作,因此我们的url模式如下所示: locations/{locationId}/{controller}/{action}/{id} 我们有这样的行动签名: public ActionResult TheAction(long locationId, long id) 这很好 我的蜘蛛感官想要抽象出在动作参数列表中包含locationId的需要。有没有办法通过超级类或ActionFilter将此值绑定到超级类属性中?最简单的方法是将locat

对于我正在进行的项目,我们在某个位置执行了一些操作,因此我们的url模式如下所示:

locations/{locationId}/{controller}/{action}/{id}
我们有这样的行动签名:

public ActionResult TheAction(long locationId, long id)
这很好


我的蜘蛛感官想要抽象出在动作参数列表中包含locationId的需要。有没有办法通过超级类或ActionFilter将此值绑定到超级类属性中?

最简单的方法是将locationId路由值添加到每个位置路由

假设您的位置将包含该编号,您可以使用正则表达式路由约束使其更具动态性:

routes.MapRoute(
    name: "location",
    url: "location{locationId}/{controller}/{action}/{id}",
    defaults: new { id = UrlParameter.Optional },
    constraints: new { locationId = @"\d+" });
或者,您可以实现IRouteConstraint,使您的位置完全基于文本,而不包括ID,这允许您基于动态数据进行映射

数据库驱动数据的另一个选项是创建一个数据段并将逻辑放在其中,它允许您一次处理多个数据段


或者,您可以创建自动生成并添加到路由表中的.NET反射/逻辑驱动路由,如中所示,但请注意,这只能在应用程序启动时完成。

不幸的是,我们有数千个位置,因此您的第一个建议无法扩展。为了避免方法中的额外参数,这些链接看起来有些过分。不过还是要谢谢你。我更新了我的答案——我之前忽略了更简单的路由约束,它非常适合只需要一个动态段的情况。
routes.MapRoute(
    name: "location",
    url: "location{locationId}/{controller}/{action}/{id}",
    defaults: new { id = UrlParameter.Optional },
    constraints: new { locationId = @"\d+" });