標籤:style class blog code http tar
趕集要發:http://www.ganji18.com
你使用路由約束來使瀏覽器要求節流在匹配特定路由的中。你可以使用一個Regex來具體化一個路由約束。
例如,設想你已在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中的路由將匹配任何下列的URLs:
· /Product/23
· /Product/7
不幸的是,該路由也將匹配下列URLs:
· /Product/blah
· /Product/apple
因為Detail()動作期待一個整型參數,做一個包含整型值以外的其它類型值的請求將導致一個錯誤。例如,如果你鍵入URL /Product/apple到你的瀏覽器中,那麼你將得到1所示的錯誤頁面。
圖1:出錯頁面
你真正想做的是僅匹配包含一個合適的整型productId。當定義一個路由來限制匹配該路由的URLs時,你可以使用一個約束。在清單3中被修改過的Product路由包含了一個只匹配整型的Regex約束。
清單3——Global.asax.cs
routes.MapRoute( "Product", "Product/{productId}", new {controller="Product", action="Details"}, new {productId = @"\d+" } );
Regex\d+匹配一個或更多個整型數字。該約束使Product路由匹配下列URLs:
· /Product/3
· /Product/8999
而不是下列的URLs:
· /Product/apple
· /Product
這些瀏覽器請求將會被另一個路由處理,要不然如果沒有匹配的路由,一個The resource could not be found的錯誤就會被返回。