高级ASP路由教程和示例

时间:2010-02-26 11:01:56

标签: asp.net-mvc asp.net-routing

我最近似乎遇到的一个主要障碍是了解我一直在开发的一些基于MVC的应用程序的一些更复杂的路由要求。 我在找到合适的教程时遇到了问题,需要通过它来完全理解。

我想找到的是一套完整的教程,用于从基本(控制器/动作/ id)到高级的所有路由。

我称之为高级路由的一个例子是:

/blog/year/month/day/title - 将映射到控制器:blog和操作:post以及参数:yearmonthday和{ {1}}

title - 会映射到控制器:/blog/title和操作:blog以及参数:post

title - 会映射到控制器:/title和操作:blog以及参数:post

我可以使用数据库将每个可能的集合映射到全局中的显式路由,但这似乎正在破坏让路由引擎路由到正确位置的观点。我宁愿定义规则一次。

1 个答案:

答案 0 :(得分:17)

我不明白,为什么不能将它们中的每一个定义为单独的路径,在需要时使用正则表达式。例如,要区分/blog/year/month/day/title/blog/title

这些集合中的每一个都是一个单独的案例,您需要告诉MVC如何处理每个集合。您可以通过defining the rule once文件中的Global.asax.cs执行此操作:

对于第一种情况:/blog/year/month/day/title

routes.MapRoute(
    "Blog Full Route", // Route name
    "blog/{year}/{month}/{day}/{title}", // URL with parameters
    new {controller = "blog", action = "post"},   // Defaults
    new {year = @"\d+", month= @"\d+", day = @"\d+"} // Constrain parameters with RegEx patterns
    );

对于第二种情况:/blog/title

routes.MapRoute(
    "Blog Title Route", // Route name
    "blog/{title}", // URL with parameters
    new {controller = "blog", action = "post"},   // Defaults
    );

对于最后一种情况:/title

routes.MapRoute(
    "Title Route", // Route name
    "{title}", // URL with parameters
    new {controller = "blog", action = "post"},   // Defaults
    );

诀窍是将这些路线按照这个确切的顺序排列,底部最不具体。更改顺序将导致使用错误的路由(特别是在最后两个中)。如果使用第二种情况切换了最后一种情况,则blog/SomeTitle类型的网址将路由到post操作,并以blog作为标题。

每当您为某事创建路线时,请记住以下几点:

  1. 使用RegEx约束路由参数
  2. very知道路线顺序(之前是哪条路线)
  3. 波浪括号{something}表示操作参数
  4. 一些很好的教程: