zoukankan      html  css  js  c++  java
  • MVC路由

    设置URL路由

    URL路径中,大括号{}内部的代表参数。/作为分割符,不再大括号内的则作为常量。值得注意的是,{controller}和{action}作为2个关键字由MVC路由控制,如果确实需要用这个名字命名参数,可以在前面加上@,例如{@action}。

    默认的设置路由在Global.asax文件中

    public static void RegisterRoutes(RouteCollection routes)方法

    routes.MapRoute(

                    "Default", // Route name

                    "{controller}/{action}/{id}", // URL with parameters

                    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

                );

    new { controller = "Home", action = "Index", id = UrlParameter.Optional }是MapRoute中的默认值,意思就是什么都不输入的时候,controller的值和action的值也是必须有值的。

    controller代表控制器,action代表这个控制器中的方法。必须要指定默认的controller和action,不然会报错。

     routes.MapRoute(

                    "Default", // Route name

                    "{controller}/{action}/{id}", // URL with parameters

                    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

                );

    实际上是以下方法的一种简写形式:

    Route myRoute = new Route("{controller}/{action}/{id}", new MvcRouteHandler())

    {

    Defaults = new RouteValueDictionary( new {

    controller = "Home", action = "Index", id = UrlParameter.Optional

    })

    };

    routes.Add("Default", myRoute);

    路由的顺序也是十分重要,URL被一次匹配每个路由模式,一旦匹配成功,就不再继续匹配下去。这点要注意。例如:

    routes.MapRoute(

    "Default", // Route name

    "{controller}/{action}/{id}", // URL with parameters

    new { controller = "Home", action = "Index", // Parameter defaults

    id = UrlParameter.Optional }

    );

    routes.MapRoute(

    "Specials", // Route name

    "DailySpecials/{date}", // URL with parameters

    new { controller = "Catalog", action = "ShowSpecials" } // Parameter defaults

    );

    这里的Specials将不会被匹配到。

    URL路由匹配的时候只匹配路径部分,域名和QueryString不会被匹配到。

    路由约束

    可以使用正则表达式对参数进行验证约束

    routes.Add(new Route("Articles/{id}", new MvcRouteHandler())

    {

    Defaults = new RouteValueDictionary(

    new { controller = "Articles", action = "Show" }

    ),

    Constraints = new RouteValueDictionary(new { id = @"\d{1,6}",id22=@"\d{1,6}" })

    });

    上面部分可以简写为如下代码:

    routes.MapRoute(null, "Articles/{id}",

    new { controller = "Articles", action = "Show" },

    new { id = @"\d{1,6}",id22=@"\d{1,6}" }

    );

    不定长度的路径

    使用*号匹配不定长度。

     

    routes.MapRoute(null, "Articles/{*articlePath}",

    new { controller = "Articles", action = "Show" }

    );

    可以匹配/Articles/Science/Paleontology/Dinosaurs/Stegosaurus

     

    匹配硬盘上的文件

    尽管设置了路由,但是如果在一些特殊的情况下,硬盘上真实存在的文件和路由的URL一致,这时系统会处理硬盘真实存在的文件,而无视路由的存在。

    要解决这个问题,使得无论是否匹配了真实存在的文件,都按照路由的URL来处理,应该在Application_Start()中如下写:

    protected void Application_Start()

            {

                AreaRegistration.RegisterAllAreas();

                RouteTable.Routes.RouteExistingFiles = true;

                RegisterRoutes(RouteTable.Routes);

            }

    RouteTable.Routes.RouteExistingFiles默认是false。

    这样设置了,就算文件真实存在都会按照路由的方式处理。除了下面2种情况:

    1.没有任何匹配的路由。则仍然按照真实文件处理。

    2.使用了IgnoreRoute(),无视了一些路由。

  • 相关阅读:
    【转载】python基础-文件读写'r' 与 'rb' 和‘r+'与’rb+'区别
    python-IndexError: list index out of range
    NameError:name ‘xrange’ is not defined
    k8s 结合docker搭建私有仓库
    部署Kubernetes-dashboard
    通过Kubeadm搭建Kubernetes集群
    .net core +gogs + jenkins +docker自动化发布、部署
    .NET Core 使用ModelBinder去掉所有参数的空格
    mysql主从同步
    IdentityServer4同时使用多个GrantType进行授权和IdentityModel.Client部分源码解析
  • 原文地址:https://www.cnblogs.com/meilibao/p/2673916.html
Copyright © 2011-2022 走看看