路由

来源:互联网 发布:c语言的封装例子 编辑:程序博客网 时间:2024/04/29 03:19
小提示:路由并不是ASP.NET MVC独有!而是ASP.NET中的一个重要功能!MVC里的路由只不过是扩展了ASP.NET的路边由功能罢了!

1.ASP.NET MVC3路由注册的位置

当新建好一个MVC3项目后,可以在根目录下的Global.asax.cs文件内看到定义了一个继承System.Web.HttpApplication类的MvcApplication类,这个类里面就包含了MVC3的路由设置.具体请看下面贴出的MvcApplication部分代码

public static void RegisterRoutes(RouteCollection routes){    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");    routes.MapRoute(        "Default", // Route name        "{controller}/{action}/{id}", // URL with parameters        new { controller = "Home", action = "Index",             id = UrlParameter.Optional } // Parameter defaults    );}protected void Application_Start(){    AreaRegistration.RegisterAllAreas();    RegisterGlobalFilters(GlobalFilters.Filters);    RegisterRoutes(RouteTable.Routes);}

摘段MSDN的关于Application_Start的介绍

Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。在应用程序域的生命周期期间,ASP.NET 仅调用这些方法一次,而不是对每个 HttpApplication 实例都调用一次。

在此MVC3应用程序是通过在Application_Start()方法里调用静态方法RegisterRoutes(RouteCollection routes)使ASP.NET有实例化MvcHandler的能力,而RegisterRoutes方法内的routes.MapRoute( … )是MVC3里对RouteCollection添加的扩展方法,位于System.Web.Mvc.RouteCollectionExtensions!

2.ASP.NET MCV3路由的使用介绍

前面第1小节里,我们已经知道了ASP.NET MVC3对System.Web.Routing.RouteCollection类进行了扩展,下面我将列出扩展方法的重载列表.然后对其找出一个参数最多的进行详细介绍!

System.Web.Mvc.RouteCollectionExtensions类 - 扩展方法列表的详细地址:

第一个我要介绍的是IgnoreRoute(string url)方法~

他的功能是用于将参数内设置的url排除在路由处理程序之外,也就是:忽略给定可用路由列表和约束列表的指定 URL 路由。

我们引用上一节里面的一行代码

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

作用:使路由系统忽略处理ASP.NET的Web资源文件(WebResource.axd或ScriptResource.axd).

另外这里的{resource}与{*pathInfo}我还未能在官网上找到详细的介绍资料.~所以在这我也只好忽略不谈~接着关注MapRoute的功能.
 

MapRoute方法在RouteCollectionExtensions里有6个重载版本!在这里我挑了一个参数最多的重载版本来进行介绍

public static Route MapRoute(
    this RouteCollection routes,
    string name,
    string url,
    Object defaults,
    Object constraints,
    string[] namespaces
)

name:路由在路由列表里的唯一名字(两次MapRoute时name不能重复)

url:路由匹配的url格式

defaults:路由url {占位符} 的默认值

constraints:url的 {占位符} 的约束

namespaces:这个是用于设置路由搜索的控制器命名空间!

在此详细分别介绍一下url, defaults, constraints这三个重要参数

在上章节的代码里MapRoute里面使用到了MVC里提供的两个特殊占位符{controller}及{action}它们分别描述的内容具体如下:
image

image
对此当MapRoute设置为

?
routes.MapRoute(
    "Default",//name
    "{controller}/{action}",//url
    new { controller = "Home", action = "Index" },//defaults
    null,//constraints
    null //namespaces
);

时,访问
http://localhost:2317/home/index
    {controller} = home, {action} = index [注意,提交的url是不区分大小写的]
http://localhost:2317/Home/About
    {controller} = home, {action} = about
http://localhost:2317/blog/home
    {controller} = blog, {action} = home
http://localhost:2317/account/logon
    {controller} = account, {action} = logon

在这里为你讲述一下defaults的作用.~
当你请求的Url属于
http://localhost:2317/
    {controller} = null, {action} = null
http://localhost:2317/Home/
    {controller} = home, {action} = null
http://localhost:2317/blog/
    {controller} = blog, {action} = null

在此~defaults会自动利用你设置好的默认值去设置{controller}及{action}

new { controller = "Home", action = "Index" }, //defaults

所以~如果你请求的url属于这种错误格式http://localhost:2317//index时~defaults并不会帮你自动完成设置

因为设置要有一个先后次序!
image

OK.url参数就先介绍到这里,更多的用途我会放在下一篇(控制器 & 视图)文章当中进行讲解!

MapRoute目前剩下的1个参数constraints的功能是对先前定义的{占位符}进行添加一个正则约束比如:

?
routes.MapRoute(
    "constraints",//name
    "{controller}/{action}",//url
    null,//defaults
    new {
 
        controller = @"[a-z]{4,}",//controller必须为英文字符,最少长度为4
 
        action = @"[a-z]{4,}" //action必须为英文字符,最少长度为4
 
    },//constraints
    null //namespaces
);

对于上面的MapRoute我们测试以下请求的URL的结果为:
/Home/index 通过
/Home/Seo 失败
/abc/Defgs 失败

如果你觉得正则匹配不符合你的要求那么你可以去实现System.Web.Routing.IRouteConstraint接口以满足你的要求! 
在这里提及一下string[] namespaces参数.~ 
当在你的MVC3应用程序里建立了不是以Controllers结尾的控制器类命名空间时,就可以通过设置这个属性来让路由系统在url匹配时应该去找那些命名空间
routes.MapRoute("namespaces",
    "{controller}/{action}",
    null, null,
    new string[] { "MvcApplication1.Custom" }
);

设置后此参数后路由系统就会去找
MvcApplication1.Controllers, MvcApplication1.Custom下带Controller结尾的继承于Controller的类了!

转自:http://www.cnblogs.com/highend/archive/2011/07/27/aspnet_mvc3_route.html
原创粉丝点击