转载:http://blog.csdn.net/francislaw/article/details/7429317

MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod 来决定返回用户什么样的信息。而把用户访问的地址对应到对应的Action(当然也可以是对应的文件)的工作有路由系统完成,这其中许多复杂的处理 由.net自动完成,而开发者需要告诉.net用户的访问地址和对应Action的具体映射关系。

     MVC中路由系统可以完成两件任务:
     1,处理从用户接收到得URL,映射到对应的Action;
     2,将某个Action根据路由系统的映射关系,反映射成符合该路由系统结构的URL(动态生成URL,当网站结构改变时,该URL同样会自动改变);
     一,处理incoming的URL:
     路由的具体映射关系是在Global.aspx文件里定义的:
     public static void RegisterRoutes( RouteCollection routes)
        {
            routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
            routes.MapRoute(
                null,
                "",// null route
                new { controller = "Product" ,
action = "List", category = ( string)null , page
= 1 },
                new[] { "SportsStore.WebUI.Controllers" }
            );
            routes.MapRoute(
                null,
                "Page{page}", // Matches /Page2, /Page123, but not /PageXYZ
                new { controller = "Product" ,
action = "List", category = ( string)null },
                new { page = @"\d+" } //
Constraints: page must be numerical
            );
            routes.MapRoute(
                null,
                "{category}", // Matches /Football or /AnythingWithNoSlash
                new { controller = "Product" ,
action = "List", page = 1 }
            );
            routes.MapRoute(
                null,
                "{category}/Page{page}", // Matches /Football or /AnythingWithNoSlash/Page1
                new { controller = "Product" ,
action = "List", page = 1 },
                new { page = @"\d+" } //
Constraints: page must be numerical
            );
            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}" , // URL with parameters
                new { controller = "Product" ,
action = "List", id = UrlParameter.Optional } // Parameter defaults
            );
        }
     在系统启动时,Application_Start()方法会调用RegisterRoutes方法,开发者自定义的路由映射就在RegisterRoutes方法中。
     1,自定义Route并添加到RouteTable中:
     Route myRoute = new Route("{controller}/{action}", new MvcRouteHandler());
     routes.Add("MyRoute", myRoute);
     2,通过Routes.MapRoute方法(其内部仍然自定义了一个Route添加)
       routes.MapRoute(
                "RouteName",                                                                           // 第一个参数指定为新建的Route的名称;
                "ABC{category}/{controller}/Page{page}/DEF",              //第二个参数为主要的映射关系
                new { controller = "Product" ,
action = "List", page = 1 },    // 第三个参数为默认参数,当映射不匹配时,会根据此默认参数进行Action的匹配
                new { page = @"\d+" },    
                                                  //第四个参数为相关限制条件,此处表示page参数必须是数字
                 new {”NameSpace“}                                                              // 第五个参数为命名空间,即该路由匹配在那个命名空间下有效
            );
     第二个参数中, "ABC{category}/{controller}/Page{page}/DEF",路由系统会根据此处的参数,把用户请求的URL和这里的参数进行匹配,有两种映射匹配方式:
   
 ①动态匹配,放在{}里的,即为要匹配的参数名,比如category,controller,page,URL中,在ABC之后,第一个/之前的内容
均会被匹配并”赋值“给category参数。同理,第二个/到第三个/之间的内容会被匹配为controler参数的值,即到此controller里
需找对应的ActionMethod。
     ②静态匹配,放在{}以外的内容,会将此处每一个字符同URL进行比较,比如ABC.../.../PAGE..../DEF
     如果URL和该参数的①和②两种比较方式比均均匹配成功,则为完全匹配成功,按URL进行相应的Controller和Action进行匹配,否则,未匹配成 功的项:比如page,会按默认的参数去匹配Action,如果默认参数匹配不成功,则抛出异常
     当注册了多个RouteMap时,会按其注册的顺序,从上到下进行匹配,匹配成功后不会再查找后面的匹配。在设计路由匹配时要注意匹配的前后顺序;
     二,将对应的Action转换为URL
     路由系统的第二个功能就是实现把某个Action转换为对应的URL。当然可以在代码中写静态的URL,但当网站的路由映射系统发生改变时,该静态URL需要全部修改,利用路由系统可以实现动态转换
     1,生成链接:<a>
   
 @Html.ActionLink("About this application", "Index", "Home",new {id =
"myAnchorID", @class = "myCSSClass"})第四个参数可以为生成的链接提供属性;
当提供的参数和路由系统中的参数不一致时,会生成QueryString:?..=..
     2,生成URL字符串:仅仅产生URL的字符串,即href后的内容
      @Html.Action(),用法同ActionLink一致。

MVC3中的路由系统(Routes)的更多相关文章

  1. ASP.NET MVC3中的路由系统 Routes

    MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...

  2. ASP.NET MVC3中的路由系统(Routes) .

    MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...

  3. ASP.NET MVC3中的路由系统

    MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...

  4. Django中的路由系统:urls

    Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告诉Django,对于这个URL调用 ...

  5. django 中的路由系统(url)

    路由系统 根据Django约定,一个WSGI应用里最核心的部件有两个:路由表和视图.Django框架 的核心功能就是路由:根据HTTP请求中的URL,查找路由表,将HTTP请求分发到 不同的视图去处理 ...

  6. 第六篇 Flask中的路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  7. asp.net中的路由系统

    ASP.NET MVC重写了ASP.NET管道HttpModule和处理程序HttpHandler.MVC自定义了MvcHandler实现了Controller的激活和Action的执行.但是在请求到 ...

  8. React中的路由系统

    React中的路由系统 提起路由,首先想到的就是 ASPNET MVC 里面的路由系统--通过事先定义一组路由规则,程序运行时就能自动根据我们输入的URL来返回相对应的页面.前端中的路由与之类似,前端 ...

  9. Flask 中的路由系统

    基本用法 Django的路由系统url集中在一起,而Flask的路由系统以装饰器的形式装饰在视图上如: @app.route("/",methods=["GET" ...

随机推荐

  1. php gd 生成日历图

    <?php //如果您提交了时间则显示您提交年月的日历,否则显示当前月份日历 if (isset($_GET['month']) && isset($_GET['year'])) ...

  2. [MSDN] 使用 SharePoint 2013 中的 JavaScript 库代码完成基本操作

    MSDN:http://msdn.microsoft.com/zh-cn/library/jj163201.aspx 了解如何编写代码以在 SharePoint 2013 中使用 JavaScript ...

  3. asp:弹出警告框,并重定向的自定义过程

    因为制作的需要写了这样一个简单的函数,重定向可以是指定的页.也可以是前一页! 有两个参数:messtr,警告框的信息;urlstr:转向的网页,为""时,返回到前一页! 程序代码 ...

  4. 几个linux命令

    常用linux命令: 普通用户命令: 一.文件和目录查看类命令 1. ls (常用参数 -l 和-h) 蓝颜色:表示目录 绿颜色:表示可执行文件 红颜色:表示压缩文件 白颜色:表示普通文件 青色:表示 ...

  5. iOS开发——推送证书

    (最近准备考试……空闲截图整理成博客)

  6. 利用css3动画和border来实现圆形进度条

    最近在学习前端的一些知识,发现border的功能十分强大啊! 首先来看看demo 就是这么一个圆形的进度条,在文本框中输入0-100的数值下面的进度条相应的转到多少 这个主要是利用border,旋转和 ...

  7. 07_XPath_02_常用语法

    [工程截图] [person.xml] <?xml version="1.0" encoding="UTF-8"?> <students> ...

  8. Web前端新人之CSS样式选择器

    最近在学习css样式.那么我就想先整理一下css样式的选择器 规则结构: 每个规则都有两个基本部分:选择器和声明块.声明块由一个或者多个声明组成,每个声明则是一个属性—值对(property-valu ...

  9. Python3 网络编程

    虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Microsoft都有各自的 ...

  10. [原创整理]这些术语你知道吗?(Web篇)

    每一个术语代表的或是一种技术,或是一项标准,那么,作为混在IT界这个江湖的你,对这些术语熟悉么? 你知道它们所指代的事物么?你知道他们被创造的目的么?你了解了设计者的思想与精髓了么?亲,跟上时代的脚步 ...