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一致。

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

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

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

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

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

  3. MVC3中的路由系统(Routes)

    转载:http://blog.csdn.net/francislaw/article/details/7429317 MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control ...

  4. 一步步学习ASP.NET MVC3 (14)——Route路由

    请注明转载地址:http://www.cnblogs.com/arhat 由于今天是星期六,所以多写几篇,感觉前几天的忙碌没有及时发布文章,趁着周末老魏尽力的多写几篇文章.因为本系列基本上快结束了,所 ...

  5. 在ASP.NET MVC3 中利用JSONP跨域登录WEB系统

    在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复登陆.每次登录都需要输入用户名和密码.最近比较流行的就 ...

  6. ASP.NET MVC4学习笔记路由系统概念与应用篇

    一.概念 1.路由是计算机网络中的一个技术概念,表示把数据包从一个网段转发至另一网段.ASP.NET中的路由系统作用类似,其作用是把请求Url映射到相应的"资源"上,资源可以是一段 ...

  7. ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?

      ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的. MVC 路由注册通常是这样的: RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 Ro ...

  8. 在ASP.NET MVC3 中利用Jsonp跨域访问

    在ASP.NET MVC3 中利用Jsonp跨域访问 在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复 ...

  9. 在ASP.NET Core中构建路由的5种方法

    原文链接 :https://stormpath.com/blog/routing-in-asp-net-core 在ASP.NET Core中构建路由的5种方法 原文链接 :https://storm ...

随机推荐

  1. differences between null pointer and void pointer.

    These are two different concepts, you cannot compare them. What the difference between the skunk and ...

  2. 15分钟快速开发一个kissy组件(流程篇)

    Step1: 安装kissy gallery组件工具 npm install yo grunt-cli -g npm install generator-kissy-gallery -g 请确保本地带 ...

  3. ios控件 UIViewController

    //通过xib文件创建一个视图控制器.并作为窗口的根控制器 self.viewController = [[ViewController alloc] initWithNibName:@"V ...

  4. drupal错误: Maximum execution time of 240 seconds exceeded

    drupal7.5安装完成,导入汉化包时,出现错误: Fatal error: Maximum execution time of 240 seconds exceeded in D:\phpweb\ ...

  5. for in 的各种坑

    for in方法用来遍历数组或者对象的显性属性,就是说我们自己定义的属性都是可以遍历的,而对象固有的属性,比如Object.prototype.toString是遍历不出来的. for in方法简洁好 ...

  6. 【多重背包模板】poj 1014

    #include <iostream> #include <stdio.h> #include <cstring> #define INF 100000000 us ...

  7. win32使用ATL显示C#COM窗体

    显示效果如图: 环境:win7 64.VS2013 代码如下: #include <atlbase.h> #include <atlhost.h> // 导入 #import ...

  8. PHP缓存技术的多种方法小结

    这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓 ...

  9. RxSwift 之官方文档

    RxSwift 官方文档结构 Introduction: Subjects Transforming Observables Filtering Observables Combining Obser ...

  10. 解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128

    今天做网页到了测试和数据库交互的地方,其中HTML和数据库都是设置成utf-8格式编码,插入到数据库中是正确的,但是当读取出来的时候就会出错,原因就是python的str默认是ascii编码,和uni ...