Creating a Route Constraint

本文介绍如何使用正则表达式作为路由约束,确保只有包含合法int类型的URL才能被匹配,从而避免错误的发生。

你要用路由约束来限制某些何特定路由匹配的请求。你可以使用正则表达式来明确规定一个理由约束。

例如,想象一下,你已经在 Global.asax文件里定义了下面的路由:
Listing 1 – Global.asax.cs

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

上面包含了一个叫product的路由。你可以使用这个路由来引导游览器请求到下面的ProductController控制器:
Listing 2 – Controllers\ProductController.cs

using System.Web.Mvc;

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时,你可以使用一个约束。下面定义的是一个包含了匹配数字的正则表达式的路由:

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


正则表达式“\d+”匹配一个或多个数字。这个约束会让product路由匹配下面的URL:

/Product/3
/Product/8999
但不是下面的URLs:

/Product/apple
/Product
这些请求会被其他路由处理。而如果没有与它们匹配的路由,或者没有找到访问的资源,将会报错。

转载于:https://www.cnblogs.com/liyou-blog/archive/2009/09/27/1575308.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值