扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
从这一章开始,我们即将进入MVC的世界,在学习MVC的过程***谕纤阉髁艘幌拢柿匣故锹嗟模徊还杂谖艺庋某跹д呃纯椿故怯械隳讯龋约壕拖肟吹接幸黄***的资料可以帮助我初步的了解一下这部分知识,然后再去学习大神们写的资料。并不是说看完文章就会可以开发、可以怎么怎么样,没有!这些都没有,只是让你在脑海中把这部分内容记住它们的模型图以及一个大概的在MVC框架中的位置或者是整个系统中的位置,说了这么多的目的就是让大家更好的了解基础知识,有了它以后的进阶会更轻松。
目前创新互联建站已为成百上千的企业提供了网站建设、域名、虚拟空间、网站托管、企业网站设计、潼关网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。可以把路由提供的功能看成是一个组件,既然是组件在哪都可能会用到的,而它所提供的功能就是URL的映射,和URL输出。在传统的Web Form开发中可能路由映射到的处理程序是一个aspx文件,而在MVC中大多数情况下是映射的控制器和控制器行为,传统的模式我们先不管,我们是来学习MVC的。
先打开VS环境,新建一个MVC的项目,在项目中会看到一个名字叫Global.asax的文件,打开它,会看到是一个MvcApplication类型并且继承自HttpApplication,在这个MvcApplication类型中有个RegisterRoutes公共的静态函数,如图1-1
图1-1
这里要关注的是routes.MapRoute()这个方法,这个方法不是RouteCollection类型本身的方法,而是一个扩展方法,看一下扩展类型的定义:
1 //} 2 // 摘要: 3 // 扩展 System.Web.Routing.RouteCollection 对象以进行 MVC 路由。 4 public static class RouteCollectionExtensions 5 { 6 7 public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, RouteValueDictionary values); 8 public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, string name, RouteValueDictionary values); 9 public static void IgnoreRoute(this RouteCollection routes, string url); 10 public static void IgnoreRoute(this RouteCollection routes, string url, object constraints); 11 public static Route MapRoute(this RouteCollection routes, string name, string url); 12 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults); 13 public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces); 14 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints); 15 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces); 16 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces); 17 }
可以在上述的类型中看到许多MapRoute()方法的重载,并且方法的参数又有这么多,这个系列方法的意义在于向路由系统中添加你自定义的一个URL映射规则。怎么添加的呢?这是根据系统上下文中的RouteTable对象中的RouteCollection类型的属***Routes,而在MapRoute()方法中的实现说白了就是根据参数生成Route对象,并且添加Route对象到服务器中,而URL规则则是在Route对象的内部构造了。
看一下示意图2:
图1-2
从上图中可以看到,一个个的Route对象被注册到服务器端中,每个Route对象自身携带着一则URL规则,暂时我们只需要理解这么多,对于RouteData对象会在后续讲解。
既然上面说到了Route对象我们就先来看一下路由Route对象的基础构造,如图1-3
图1-3
(ps:这个图不是结构图不是什么正规的画法,相当于一个思维导图,让人看了能明白就行)
先从图1-3的MapRoute()方法开始说起吧,在这个方法的内部会生成一个Route对象,并且添加到当前的RouteCollection类型的对象中。
图1-4
在图1-4中MapRoute方法中的”Default”参数表示着Route对象的内部是有着Name这个属***值的,只是没有公开使用而已,可以通过这样的方式来对路由进行名称赋值。
”{controller}/{action}/{id}”参数对应的Route对象的Url属***,只不过在MapRoute内部做赋值操作的时候,Route对象Url属***的Set访问器也在做着额外的操作,对Url进行解析生成成Url的规则,这个内容在后面的篇幅会有讲到。
参数new {controller="Home",action="Index",id=UrlParameter.Optional}则会编译成一个动态类型,此类型中包含参数中定义的controller、action和id三个属***,在MapRoute()方法中会先判断类型是否是RouteValueDictionary类型,如果是的话会直接赋值到Defaults属***,否则会使用其它的方法把根据这个动态类型生成一个RouteValueDictionary类型实例。
这里捎带一句RouteValueDictionary类型出现频率较高,主要是因为Route对象的的几个属***都是这个类型,把它作为键值队来想就行了。
图1-5
这种思维图没有重复,只是希望作为初学者阅读完本篇过后能留下的整体印象就是最后的这幅图。
Route对象的属***和函数一篇是说不完的,文章的目的只是一个基础***的扫盲,铺设基础而已,会在后续的篇幅中说到Route对象的Url规则定义和RouteData的由来,以及RouteCollection对象的一些基础概念。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流