zoukankan      html  css  js  c++  java
  • ASP.NET MVC学习(一)之路由篇Route

    什么是路由

    通过【路由】配置,路由可以规定URL的特殊格式,使其达到特殊效果。

    在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法中,执行相应操作,并接受URL中传过来的参数,

    在MVC5框架中,在【RouteConfig.cs】类中进行路由规则的配置

     public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }
        }

    参数的含义

    (1) name:  要映射的路由的名称。

    (2) url:  路由的 URL 模式,可以自定义路由的格式,可以写静态路由,也可以写动态路由、组合路由等。

    (3) defaults:  一个包含默认路由值的对象,书写路由的默认值。

    (4) constraints: 一组表达式,可以使用正则指定 url 参数值的约束。

    (5) namespaces: 应用程序的一组命名空间,可以缩小检索路由对象匹配的范围。

    public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
            {
                if (routes == null)
                {
                    throw new ArgumentNullException("routes");
                }
                if (url == null)
                {
                    throw new ArgumentNullException("url");
                }
                Route route = new Route(url, new MvcRouteHandler()) {
                    Defaults = CreateRouteValueDictionaryUncached(defaults),
                    Constraints = CreateRouteValueDictionaryUncached(constraints),
                    DataTokens = new RouteValueDictionary()
                };
                ConstraintValidation.Validate(route);
                if ((namespaces != null) && (namespaces.Length > 0))
                {
                    route.DataTokens["Namespaces"] = namespaces;
                }
                routes.Add(name, route);
                return route;

    MVC中的几类路由及其规则

     动态路由

            routes.MapRoute(
                     name: "Default",    //路由名称
                     url: "{controller}/{action}/{id}",   //路由规则
                     defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional }  //默认值,当Controller或action为空(省略)的时候调用
                 );

    静态路由

            routes.MapRoute(
                     name: "Default2",    //路由名称
                     url: "Ypf",   //路由规则,不区分大小写,当输入“ypf”时,会自动跳转到下面的地址
                     defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional }  //默认值,当Controller或action为空的时候调用
                 );

    组合路由

           routes.MapRoute(
                  "Default4",    //路由名称
                  "Ypf/{action}",   //路由规则,不区分大小写,规则相符的时候,会自动跳转到下面的地址
                   new { controller = "First", action = "Index1" }
              );

    正则约束

            routes.MapRoute(
                    "Default5",
                     "{controller}/{action}_{Year}_{Month}_{Day}",
                     new { controller = "First", action = "Index1", id = UrlParameter.Optional },
                     new { Year = @"^d{4}", Month = @"d{2}", Day = @"d{2}" }
                 );//正则路由

    所谓的正则约束,是指可以对URL中的参数使用正则表达式进行约束,上述代码约束了Year必须是四位数字,Month和Day必须是两位数字。

     命名空间约束

             routes.MapRoute(
                      name: "Default6",
                      url: "{controller}/{action}/{id}",
                      defaults: new { controller = "Third", action = "Index", id = UrlParameter.Optional },
                      namespaces: new string[] { "Ypf.MVC5" }
                 );

    所谓的命名空间约束,即限定匹配范围路由的检索范围,提高检索速度。

    特别注意:不能从外层控制器直接跳转到内层Area内的控制器!!

    Area区域内的路由

    public override void RegisterArea(AreaRegistrationContext context) 
            {
                //原路由
                //context.MapRoute(
                //    "TestOne_default",
                //    "TestOne/{controller}/{action}/{id}",
                //    new { action = "Index", id = UrlParameter.Optional }
                //);
    
                //结合命名空间进行路由改造
                context.MapRoute(
                   this.AreaName + "_default",
                   this.AreaName + "/{controller}/{action}/{id}",
                   new { area = this.AreaName, controller = "Sys_Admin", action = "Index", id = UrlParameter.Optional },
                   new string[] { "Ypf.MVC5.Areas." + this.AreaName + ".Controllers" }
               );
    
            }

     其他

    1.URL路径和路由配置中的路径对比

    2.由上面的图,我们可以得出下面的一组路由数据

     3.二义性

    如果我们在Models中也新建一个Home控制器,那么你会发现重新刷新之后报错了。而这个是因为无法确定到底选择哪个控制器来响应该请求的缘故,当然你认为只要我们不新建重名的控制器就可以了,这样你只能控制你的项目中不出现,但是你却无法控制你加载的类库中不会出现,但是ASP.NET MVC已经提供了解决方案给我们,如下改正

    RouteConfig.cs:

    public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    namespaces: new[] { "MvcStudy.Controllers" }
                );
            }
        }
    

     我们可以看到namespaces参数,通过将命名空间的名称传进去就可以起到排除二义性的问题了。

     4.约束路由

    上面我们有一个{id}用来捕获参数的,但是你也发现了它可以捕捉任何字符串等等,但是我们有时需要限制它,比如让它只能输入数字,那么我们就可以使用正则表达式去约束它。

    public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    constraints: new{id = @"^d*$"},
                    namespaces: new[] { "MvcStudy.Controllers" }
                );
            }
        }
    

    5.URL路由机制

    6.MVC Area出现找到多个与名为Home的控制器匹配的类型错误的解决方法

    第一种方式:在RouteConfig中添加路由

     public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                   name: "Admin",
                   url: "Admin/{controller}/{action}/{id}",
                   defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    namespaces: new string[] { "ASP.NETMVCProject.Areas.Admin.Controllers" }//添加命名空间
               );
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    namespaces: new string[] { "ASP.NETMVCProject.Controllers" }//添加命名空间
                );
            }
        }
    

    第二种方式:在AdminAreaRegistration中添加命名空间

    public class AdminAreaRegistration : AreaRegistration 
        {
            public override string AreaName 
            {
                get 
                {
                    return "Admin";
                }
            }
    
            public override void RegisterArea(AreaRegistrationContext context) 
            {
                context.MapRoute(
                    "Admin_default",
                    "Admin/{controller}/{action}/{id}",
                    new { action = "Index", id = UrlParameter.Optional },
                   namespaces: new string[] { "ASP.NETMVCProject.Areas.Admin.Controllers" }//添加命名空间
                );
            }
        }
    

    7.显示禁用路由

     8.自定义路由

    routes.MapRoute(
     "Detail",// Route name
     "Expert/Detail/{q}.htm",// URL with parameters
     new { controller = "Expert", action = "Detail", q = "" }// Parameter defaults
    );
  • 相关阅读:
    小程序运行环境
    在虚拟机系统上安装oracle教程
    Java keywords
    Java bytecode instruction listings
    一个理解JVM的例子2
    一个理解JVM的例子
    JDK的环境变量设置
    JRE、JDK和JVM的关系
    合理的封装实例
    修改源码的几种取巧的方式
  • 原文地址:https://www.cnblogs.com/cnki/p/6105553.html
Copyright © 2011-2022 走看看