创建路由约束 (C#)

作者 :Stephen Walther

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

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

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

清单 1 - Global.asax.cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"}
);

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

列表 2 - Controllers\ProductController.cs

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        public ActionResult Details(int productId)
        {
            return View();
        }
    }
}

请注意,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.cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
 );

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

  • /Product/3
  • /Product/8999

但不是以下 URL:

  • /Product/apple

  • /Product

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