我最近似乎遇到的主要障碍之一是围绕我正在开发的一些基于MVC的应用程序的一些更复杂的路由要求。我在寻找正确的教程以引导我浏览它以获取完整的理解时遇到问题。

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

我所说的高级路由的一个例子是:

/blog/year/month/day/title - 将映射到控制器: blog 和行动: post 作为参数: year, month, daytitle

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

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

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

有帮助吗?

解决方案

我不明白,为什么在需要时使用正则表达式,为什么不能将其中的每个路线定义为单独的路线。例如,区分 /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
    );

诀窍是将这些路由放置在此确切顺序中,而最少的特异性在底部。更改顺序将导致使用错误的路由(特别是在最后两个中)。如果最后一个情况与第二种情况切换,则类型的URL blog/SomeTitle 将路线到达 post 采取行动 blog 作为标题。

每当您创建某事的路线时,请记住以下内容:

  1. 用正则参数约束路由参数
  2. very 意识到路线订单(哪个路线到了)
  3. 弯曲的支架 {something} 表示动作参数

一些好的教程:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top