现在的位置: 首页 > 综合 > 正文

Routing简介

2013年10月01日 ⁄ 综合 ⁄ 共 2964字 ⁄ 字号 评论关闭

参考:http://www.cnblogs.com/lukun/category/310863.html 

Url路由是在学习MVC一个很重要的开始,为了方便掌握,做个记录

URL路由
ASP.NET MVC 框架将使用 ASP.NET 路由引擎,通过该引擎可以灵活地将 URL 映射到 controller 类。 您可以定义 ASP.NET MVC 框架使用的路由规则,以评估传入的 URL 以及选择相应的控制器。 您还可以让该路由引擎自动分析 URL 中定义的变量,并让 ASP.NET MVC 框架将值作为参数自变量传递给控制器。
URL 中可以包含文本值和变量占位符(也称为“URL 参数”)。 文本和占位符位于由斜杠 (/) 字符分隔的 URL 段中。
当生成请求时,URL 分析为段和占位符,变量值提供给请求处理程序。在 URL 模式中,可以通过用大括号({ 和 })括住占位符来定义占位符。 可以在一个段中定义多个占位符,但必须用一个文本值分隔开。 例如,{product}-{show}/{action} 是有效的路由模式。 但是,由于占位符之间没有文本值或分隔符,所以 {product}{show}/{action} 不是有效的模式。 因此必须占位符的值分隔开。
MVC 应用程序中用于路由的 URL 模式通常包括 {controller} 和 {action} 占位符。
当收到请求时,会将其路由到 UrlRoutingModule 对象,然后路由到 MvcHandler HTTP 处理程序。 MvcHandler HTTP 处理程序通过向 URL 中的控制器值添加后缀“Controller”以确定将处理请求的控制器的类型名称,来确定要调用的控制器。 URL 中的操作值确定要调用的操作方法。
例如,包含 URL 路径 /Products 的 URL 映射到名为 ProductsController 的控制器。 action 参数中的值是调用的操作方法的名称。 包含 URL 路径 /Products/show 的 URL 将导致调用 ProductsController 类的 Show 方法。
下表显示了默认 URL 模式,并给出由默认路由处理的 URL 请求的示例。
对于 IIS 7.0,不需要文件扩展名。 对于 IIS 6.0,必须向 URL 模式添加 .mvc 文件扩展名,如:
添加路由约束
除了按照 URL 中的参数数量将 URL 请求匹配到路由定义中,还可以指定参数中的值满足特定约束。 如果一个 URL 包含路由的约束以外的值,则该路由不用于处理请求。 添加约束以确保 URL 参数包含将在应用程序中起作用的值。
约束是通过使用正则表达式或使用实现 IRouteConstraint 接口的对象来定义的。 将路由定义添加到 Routes 集合时,同时也通过创建一个包含验证测试的 RouteValueDictionary 对象添加了约束。 字典中的关键字标识约束适用的参数。 字典中的值可以是表示正则表达式的字符串,也可以是实现 IRouteConstraint 接口的对象。
提供字符串后,路由将视字符串为正则表达式,并通过调用 Regex 类的 IsMatch 方法检查参数值是否有效。 总是将正则表达式视为不区分大小写。
提供 IRouteConstraint 对象后,ASP.NET 路由将通过调用 IRouteConstraint 对象的 Match 方法检查参数值是否有效。 Match 方法返回一个布尔值,该值指示参数值是否有效。
{controller}.mvc/{action}/{id}

Global.asax
       public static void RegisterRoutes(RouteCollection routes)
        {
            //忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
   
   // 默认路由定义
            routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 当访问的URL有page值的时候, 我们就采用传入的vallue, 如果没有, 那么我们就不想action方法中传任何参数在调用的时候可以用int? id 表示可以不传入ID值
            );
   
        // 默认路由
            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Student", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

            // 自定义路由 用正则匹配
            routes.MapRoute(
                "Student",
                "Student/{*values}", // 匹配所有Details/所有(*表示所有)
                new { controller = "Details", action = "default", id = UrlParameter.Optional }
                );
            routes.MapRoute(
                "Rule",
                "{controller}/{action}/{id}", // URL
                 new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 参数默认值
                 new { controller = @"\d{2}", httpMethod = new HttpMethodConstraint("GET", "POST") } // 定义了规则 contoller只能为2位数字
                );

            // Details/list/BJ/100,200-3
            routes.MapRoute(
                "Details",
                "Details/{action}/{city}/{price}-{star}",
                new { controller = "Details", action = "list", city = "BJ", price = "-1,-1", star = "5" },
                new { city = @"[a-zA-Z]*", price = @"(\d)+\,(\d)+", star = "[-1-5]" }
                );

            // 自定义路由 
            routes.MapPageRoute("",
                                "Category/{action}/{categoryName}",
                                "~/catelist.aspx", // 物理路径,需要开关打开才能访问
                                true,
                                new RouteValueDictionary {{"categoryName", "book"}, {"action", "show"}},
                                new RouteValueDictionary {{"cate", "[a-z]{2}-[a-z]{2}"}, {"year", @"\d{4}"}}
                // RouteValueDictionary 创建具有约束的路由
                );
        }

        protected void Application_Start()
        {
            //在程序启动的时候注册我们前面定义的Route规则
            RegisterRoutes(RouteTable.Routes);
        }

  
  很多可以根据自己的规则灵活配置路由,配置复杂的路由,需要对正则有一定的掌握

抱歉!评论已关闭.