9

我最近似乎遇到的主要障碍之一是了解我一直在开发的一些基于 MVC 的应用程序的一些更复杂的路由要求。我很难找到正确的教程集来引导我完成它以获得完整的理解。

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

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

/blog/year/month/day/title- 将映射到 controller:blog和 action:post并作为参数: year, month, dayandtitle

/blog/title- 将映射到控制器:blog和动作:post并作为参数:title

/title- 将映射到控制器:blog和动作:post并作为参数:title

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

4

1 回答 1

17

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

这些集合中的每一个都是一个单独的案例,您需要告诉 MVC 如何处理每个案例。您可以通过defining the rule onceGlobal.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
    );

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

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

  1. 使用 RegEx 约束路由参数
  2. 注意very路线顺序(哪条路线在哪条之前)
  3. 波浪形括号{something}表示动作参数

一些不错的教程:

于 2010-02-26T14:25:23.683 回答