你要用路由约束来限制某些何特定路由匹配的请求。你可以使用正则表达式来明确规定一个理由约束。
例如,想象一下,你已经在 Global.asax文件里定义了下面的路由:
Listing 1 – Global.asax.cs
"Product",
"Product/{productId}",
new {controller="Product", action="Details"}
);
上面包含了一个叫product的路由。你可以使用这个路由来引导游览器请求到下面的ProductController控制器:
Listing 2 – Controllers\ProductController.cs
namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
public ActionResult Details(int productId)
{
return View();
}
}
}
注意到通过让Product控制器接受一个叫productId的参数,Details()动作就暴露出来了。这个参数是一个int类型的。
在listing 1里定义的路由会匹配下面的任何URL:
/Product/23
/Product/7
不幸的是,这个路由也会匹配下面的URL:
/Product/blah
/Product/apple
因为Detail()动作接受一个int类型的参数,发送一个包含不是int类型的参数的URL过来会引发错误。例如,如果你输入URL( /Product/apple),那么你会出现下面的错误:
你真正想要干的是,只匹配包含合法的int类型的URL。在你定义一个路由来限制匹配的URL时,你可以使用一个约束。下面定义的是一个包含了匹配数字的正则表达式的路由:
"Product",
"Product/{productId}",
new {controller="Product", action="Details"}, new {productId = @"\d+" }
);
正则表达式“\d+”匹配一个或多个数字。这个约束会让product路由匹配下面的URL:
/Product/3
/Product/8999
但不是下面的URLs:
/Product/apple
/Product
这些请求会被其他路由处理。而如果没有与它们匹配的路由,或者没有找到访问的资源,将会报错。