转载: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. HTML5吧!少年

     一.为了能使IE9以下的IE浏览器也能支持html5的标签,所以首先得在文档头部用条件注释的方法引入那段著名的代码. 1 2 3 <!--[if lt IE 9]> <script ...

  2. ant design 树形组件怎么使用

    getDefaultProps doesn't work with ES6 syntax; warning is not helpful 解决后: 参考地址:https://github.com/fa ...

  3. Apache Mesos总体架构

    http://developer.51cto.com/art/201401/426507.htm 1. 前言 同其他大部分分布式系统一样,Apache Mesos为了简化设计,也是采用了master/ ...

  4. asp图片化电话号码,避免蜘蛛之类爬走用户隐私

    作用:将页面中的电话号码生成图片格式.挺多的分类信息类网站使用这个功能.不用真正的生成图片.原理类似验证码,挺不错的. <% Call Com_CreatValidCode(Request.Qu ...

  5. 【转】JavaScript系列文章:自动类型转换

    我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...

  6. File Operation using SHFileOperation

    SHFILEOPSTRUCT Original link: http://winapi.freetechsecrets.com/win32/WIN32SHFILEOPSTRUCT.htm Refere ...

  7. Java小程序---接口中抽象方法的实现(解决了JAVA语言不能多继承的问题)

    public interface Sing { public static final String eyecolor="black"; public void sleep(); ...

  8. OpenSUSE共享网络

    因为想要使用Arduino Ethernet扩展版,想要搭建一个局域网供其使用有线,无奈路由器离我太远.遂有本文. 实验器材: 装有OpenSUSE.有线网卡.无线网卡的笔记本. 路由器一台. 实验步 ...

  9. animation css3动画与CSS3 @keyframes担配使用创建往复平缓动画

    通过 @keyframes 规则,您能够创建动画. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 在动画过程中,您能够多次改变这套 CSS 样式. 以百分比来规定改变发生的时间,或者通 ...

  10. php用户验证代码的简单例子

    发布:sunday01   来源:net     [大 中 小] 分享一个简单的php用户验证代码,适合初学的朋友参考,主要学习$_post传递数据及isset检测变量的方法. php简单用户验证代码 ...