ASP.NET MVC路由()

前言

从这一章开始,我们即将进入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对象的一些基础概念。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC 路由(一)的更多相关文章

  1. ASP.NET MVC 路由(二)

     ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...

  2. ASP.NET MVC 路由(三)

    ASP.NET MVC路由(三) 前言 通过前两篇的学习会对路由系统会有一个初步的了解,并且对路由系统中的Url规则有个简单的了解,在大家的脑海中也有个印象了,那么路由系统在ASP.NETMVC中所处 ...

  3. ASP.NET MVC 路由(四)

    ASP.NET MVC路由(四) 前言 在前面的篇幅中我们讲解路由系统在MVC中的运行过程以及粗略的原理,想必看过前面篇幅的朋友应该对路由有个概念性的了解了,本篇来讲解区域,在读完本篇后不会肯定的让你 ...

  4. ASP.NET MVC 路由(五)

    ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...

  5. Asp.Net MVC 路由 - Asp.Net 编程 - 张子阳

    http://cache.baiducontent.com/c?m=9d78d513d98316fa03acd2294d01d6165909c7256b96c4523f8a9c12d522195646 ...

  6. AngularJS html5Mode与ASP.NET MVC路由

    AngularJS html5Mode与ASP.NET MVC路由共存 前言 很久之前便听说AngularJS,非常酷,最近也比较火,我也在持续关注这个技术,只是没有认真投入学习.前不久公司找我们部门 ...

  7. Asp.Net MVC路由调试好帮手RouteDebugger

    Asp.Net MVC路由调试好帮手RouteDebugger 1.获取方式 第一种方法: 在程序包控制台中执行命令 PM> Install-Package routedebugger 安装成功 ...

  8. ASP.NET MVC路由(5)

    ASP.NET MVC路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的实 ...

  9. ASP.NET MVC路由

    ASP.NET MVC路由(四) 前言 在前面的篇幅中我们讲解路由系统在MVC中的运行过程以及粗略的原理,想必看过前面篇幅的朋友应该对路由有个概念性的了解了,本篇来讲解区域,在读完本篇后不会肯定的让你 ...

随机推荐

  1. FZU 2137 奇异字符串 后缀树组+RMQ

    题目连接:http://acm.fzu.edu.cn/problem.php?pid=2137 题解: 枚举x位置,向左右延伸计算答案 如何计算答案:对字符串建立SA,那么对于想双延伸的长度L,假如有 ...

  2. (UWP)通过编写算法实现在地图中的渐变路径

    目前的一个App中需要实现这个需求,但是在UWP自带的Bing Map中,绘制的MapPolyline的StrokeColor的类型是Windows.UI.Color,也就是说一条MapPolylin ...

  3. #英文#品读中国城市个性——最好的和最坏的&当东方遇到西方

    冒险家的乐园 a playground of risk 实现发财梦 realize one's dreams of wealth 道德沦丧,堕落 moral deprivation 租界 foreig ...

  4. MIT 6.828 JOS学习笔记15. Lab 2.1

    Lab 2: Memory Management lab2中多出来的几个文件: inc/memlayout.h kern/pmap.c kern/pmap.h kern/kclock.h kern/k ...

  5. xml_TO_object

    一般对于开发人员拿到的xml文件都是配置文件,所以对于我们来说,最主要要做的事情是将xml的内容封装成对象. 下面展示代码 package javaDom4j; import java.util.Ar ...

  6. 转:简单窗体振动-WaitForSingleObject,消息,winapi

    http://www.cnblogs.com/Jekhn/archive/2012/08/25/2656656.html 线程,消息函数,SetWindowPos设置窗体位置 if WaitForSi ...

  7. HDU 4801 Pocket Cube

    题目链接 去年现场,虎哥1Y的,现在刷刷题,找找状态... 一共6种转法,把3个面放到顶部,左旋和右旋,感觉写的还不错....都写成常数了. #include <stdio.h> #inc ...

  8. Windows下使用doxygen阅读和分析C/C++代码

    Windows下使用doxygen阅读和分析C/C++代码 转自:http://blog.sina.com.cn/s/blog_63d902570100gwk6.html 虽然使用各种IDE或者Sou ...

  9. 如何让{dede:channel}有子栏目显示子栏目,无子栏目不显示同级栏目

    我们在使用织梦系统制作网站时经常会遇到网站栏目较多,显示当前栏目下的二级与三级栏目时,使用栏目嵌套标签,但是当三级栏目为空时,会显示同级栏目.从用户体验角度出发,常理情况下也是需要空白的,即二级栏目下 ...

  10. 常用的107条Javascript

    1.         document.write( " "); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document- >html- >( ...