软件开发技术交流

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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

例如,假设你在代码1的Global.asax文件中已经定义了如下路由。

代码1 – Global.asax.cs

view plaincopy to clipboardprint?
routes.MapRoute( "Product", "Product/{productId}", new {controller="Product", action="Details"} );  
routes.MapRoute( "Product", "Product/{productId}", new {controller="Product", action="Details"} );  

代码1 约束了一个名为Product的路由。可以使用Product路由来将浏览器请求影射到约束ProductController,如代码2。

代码2 – Controllers\ProductController.cs

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

注意有Product控制器暴露的 Details() action 接受一个名为productId的简单参数。这个参数是一个整形参数。

代码1中定义的路由还匹配如下URL:

/Product/23
/Product/7
但是路由并不匹配以下 URL:

/Product/blah
/Product/apple
因为 Details() action 需要一个整形参数,所以发送一个包含其它东西而不是整形值的请求的话会导致一个错误。例如,如果你在浏览器中输入 URL /Product/apple 那么你就会得到如图1所示的错误。

图01: 看到页面挂了(点击查看完整大小)

只要将URL包含一个正确的整形productId就可以了。当定义一个要限制匹配路由的URL时你就可以使用约束。代码3中是修改后的 Product 路由,它包含一个只匹配整形的正则表达式约束。

Listing 3 – Global.asax.cs

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

正则表达式 \d+ 匹配一个或多个整形。这个约束使得 Product 路由匹配以下 URL:

/Product/3
/Product/8999
但以下 URL 不行:

/Product/apple
/Product
这些浏览器请求会被其他路由处理,或者,如果没有匹配的路由,会返回无法找到资源错误。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ojlovecd/archive/2010/02/07/5296032.aspx

posted on 2010-04-13 13:58  Felix888  阅读(219)  评论(0)    收藏  举报