来自网址前缀

时间:2017-02-10 10:56:37

标签: c# asp.net-mvc

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

locations/{locationId}/{controller}/{action}/{id}

所以我们有这样的行动签名:

public ActionResult TheAction(long locationId, long id)

哪个好。

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

1 个答案:

答案 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中所示(但请注意,这只应在应用程序启动时完成)。