zoukankan      html  css  js  c++  java
  • MVC3中的路由系统(Routes)

    转载: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一致。
  • 相关阅读:
    c语言结构体数组引用
    c语言结构体数组定义的三种方式
    如何为SAP WebIDE开发扩展(Extension),并部署到SAP云平台上
    SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
    使用SAP API portal进行SAP SuccessFactors的API测试
    SAP UI5应用里的页面路由处理
    在SAP WebIDE Database Explorer里操作hdi实例
    如何使用SAP事务码SAT进行UI应用的性能分析
    使用SAP WebIDE进行SAP Cloud Platform Business Application开发
    SAP CRM WebClient UI ON_NEW_FOCUS的用途
  • 原文地址:https://www.cnblogs.com/BluceLee/p/4076380.html
Copyright © 2011-2022 走看看