0

我有几个 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 与当前代码组织联系在一起)。* 创建一个属性,我可以将它放在操作方法上来配置它们的路由。然后我可以反映所有控制器并在应用程序启动时配置路由。

是否有这样做的最佳实践/内置方法?

4

1 回答 1

2

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

但是,我鼓励您查看AttributeRouting,至少对我而言,它远远优于以传统方式管理路由。使用 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 包即可获得基本相同的功能),但如果您开始一个新项目,那么拥有它绝对是一件好事。

于 2013-10-22T20:58:02.980 回答