使用所需参数一般映射路径的最佳方法是什么?

时间:2013-10-22 20:23:42

标签: c# asp.net-mvc asp.net-mvc-3

我有几个ASP.NET MVC控制器。其中许多采用一个或多个所需值(例如ID)。因为这些值是必需的,所以我想让它们成为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绑定到当前代码组织)。 *创建一个属性,我可以把它放在动作方法上来配置它们的路线。然后,我可以反映所有控制器并在应用程序启动时配置路由。

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

1 个答案:

答案 0 :(得分: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包来获得基本相同的功能),但是如果你开始使用一个新项目,那肯定是很好的。