创建路由约束 (VB)

作者 :Stephen Walther

在本教程中,Stephen Walther 演示如何通过使用正则表达式创建路由约束来控制浏览器请求如何匹配路由。

使用路由约束来限制与特定路由匹配的浏览器请求。 可以使用正则表达式指定路由约束。

例如,假设已在 Global.asax 文件中的清单 1 中定义了路由。

清单 1 - Global.asax.vb

routes.MapRoute( _
    "Product", _
    "Product/{productId}", _
    New With {.controller = "Product", .action = "Details"} _
)

列表 1 包含名为 Product 的路由。 可以使用 Product 路由将浏览器请求映射到清单 2 中包含的 ProductController。

清单 2 - Controllers\ProductController.vb

Public Class ProductController
    Inherits System.Web.Mvc.Controller
    Function Details(ByVal productId As Integer) As ActionResult
        Return View()
    End Function
End Class

请注意,Product 控制器公开的 Details () 操作接受名为 productId 的单个参数。 此参数是整数参数。

清单 1 中定义的路由将匹配以下任何 URL:

  • /Product/23
  • /Product/7

遗憾的是,路由还将匹配以下 URL:

  • /Product/blah
  • /Product/apple

由于 Details () 操作需要整数参数,因此发出包含整数值以外的内容的请求将导致错误。 例如,如果在浏览器中键入 URL /Product/apple,则会看到图 1 中的错误页。

“新建项目”对话框

图 01:查看页面爆炸 (单击以查看全尺寸图像)

你真正想要做的是仅匹配包含正确整数 productId 的 URL。 定义路由时可以使用约束来限制与路由匹配的 URL。 清单 3 中修改后的 Product 路由包含仅匹配整数的正则表达式约束。

清单 3 - Global.asax.vb

routes.MapRoute( _
   "Product", _
   "Product/{productId}", _
   New With {.controller = "Product", .action = "Details"}, _
   New With {.productId = "\d+"} _
)

正则表达式 \d+ 匹配一个或多个整数。 此约束导致 Product 路由与以下 URL 匹配:

  • /Product/3
  • /Product/8999

但不是以下 URL:

  • /Product/apple
  • /Product

这些浏览器请求将由另一个路由处理,或者,如果没有匹配的路由,将返回 “找不到资源 ”错误。