使用所需参数通常映射路由的最佳方法是什么

本文关键字:路由 映射 最佳 是什么 方法 参数 常映射 | 更新日期: 2023-09-27 18:36:24

我有几个 ASP.NET MVC控制器。其中许多采用一个或多个必需的值(例如 ids)。因为这些值是必需的,所以我想使它们成为 url 路径的一部分,而不是查询字符串参数。例如:

// route should be MyController/Action1/[someKindOfId1]
public ActionResult Action1(int someKindOfId1) { ... }
// less commonly:
// route should be MyController/Action1/[someKindOfId2]/[someKindOfId3]
public ActionResult Action2(int someKindOfId2, int someOtherKindOfId3) { ... }

我正在寻找一种方法来映射这些路线,而无需手动列出每条路线。例如,我目前做:

routes.MapRoute(
    "Action1Route",
    "MyController/Action1/{someKindOfId1}",
    new { controller = "MyController", action = "Action1" }
);

我考虑过的一些方法:* 使用默认的 {controller}/{action}/{id} 路由,只需将我的参数重命名为 id 或(不确定这是否有效)使用 [Bind] 属性允许将它们绑定到 id 路由值,同时仍然具有描述性名称。这仍然将我限制为一个通用的控制器/操作基 URL(不错,但也不是最灵活的,因为它将 URL 与当前代码组织相关联)。* 创建一个属性,我可以将其放在操作方法上以配置其路由。然后,我可以反映所有控制器并在应用程序启动时配置路由。

是否有最佳实践/内置方法来执行此操作?

使用所需参数通常映射路由的最佳方法是什么

可悲的是,没有。您描述的方法是 MVC 路由的唯一方法。如果不打算使用默认方案(或至少使用您自己的默认版本),则必须为每个唯一方案添加单独的路由。

但是,我鼓励您查看AttributeRouting,至少对我来说,它远远优于以传统方式管理路由。使用属性路由,您可以使用适当的属性为每个控制器操作指定 URL。例如:

[GET("MyController/Action1/{someKindOfId1}")]
public ActionResult Action1(int someKindOfId1) { ... }
[GET("MyController/Action1/{someKindOfId2}/{someKindOfId3}")]
public ActionResult Action2(int someKindOfId2, int someOtherKindOfId3) { ... }

只是,您也不需要使用控制器/操作路由方案,因此您可以执行以下操作:

[GET("foo/{someKindOfId1}")]
public ActionResult Action1(int someKindOfId1) { ... }
[GET("foo/{someKindOfId2}/{someKindOfId3}")]
public ActionResult Action2(int someKindOfId2, int someOtherKindOfId3) { ... }

更好的是,您可以向控制器本身添加 RoutePrefix 属性,以指定应应用于该控制器中所有操作的路径部分:

[RoutePrefix("foo")]
public class MyController : Controller
{
    [GET("{someKindOfId1}")]
    public ActionResult Action1(int someKindOfId1) { ... }
    [GET("{someKindOfId2}/{someKindOfId3}")]
    public ActionResult Action2(int someKindOfId2, int someOtherKindOfId3) { ... }
}

还支持处理区域,子域等,您甚至可以对参数进行类型限定(例如 {someKindOfId1:int}使其仅在 URL 部分为整数类型时才匹配)。阅读文档。

更新

值得一提的是,ASP.NET 5 现在内置了属性路由。(它实际上使用的代码与该包的作者提交的 AttributeRouting 非常相似。升级所有项目本身并不是一个足够好的理由(因为您可以添加 AttributeRouting 包以获得基本相同的功能),但如果您从一个新项目开始,那绝对是件好事。