使用路由約束來限制匹配特定路由的瀏覽器請求。可以使用Regex來指定約束。
例如,假設你在代碼1的Global.asax檔案中已經定義了如下路由。
代碼1 – Global.asax.cs
routes.MapRoute( "Product", "Product/{productId}", new {controller="Product", action="Details"} );
代碼1 約束了一個名為Product的路由。可以使用Product路由來將瀏覽器請求影射到約束ProductController,如代碼2。
代碼2 – Controllers/ProductController.cs
using System.Web.Mvc;<br />namespace MvcApplication1.Controllers<br />{<br /> public class ProductController : Controller<br /> {<br /> public ActionResult Details(int productId)<br /> {<br /> return View();<br /> }<br /> }<br />}
注意有Product控制器暴露的 Details() action 接受一個名為productId的簡單參數。這個參數是一個整形參數。
代碼1中定義的路由還匹配如下URL:
但是路由並不匹配以下 URL:
- /Product/blah
- /Product/apple
因為 Details() action 需要一個整形參數,所以發送一個包含其它東西而不是整形值的請求的話會導致一個錯誤。例如,如果你在瀏覽器中輸入 URL /Product/apple 那麼你就會得到1所示的錯誤。
圖01: 看到頁面掛了(點擊查看完整大小)
只要將URL包含一個正確的整形productId就可以了。當定義一個要限制匹配路由的URL時你就可以使用約束。代碼3中是修改後的 Product 路由,它包含一個只匹配整形的Regex約束。
Listing 3 – Global.asax.cs
routes.MapRoute( "Product", "Product/{productId}", new {controller="Product", action="Details"}, new {productId = @"/d+" } );
Regex /d+ 匹配一個或多個整形。這個約束使得 Product 路由匹配以下 URL:
但以下 URL 不行:
這些瀏覽器請求會被其他路由處理,或者,如果沒有匹配的路由,會返回無法找到資源錯誤。
原文地址:http://www.asp.net/learn/mvc/tutorial-24-cs.aspx