MVC 路由规则

一、路由规则说明

  先来看MVC中的默认路由的说明

"{controller}/{action}/{id}", // URL with parameters
  对于Url  /Home/Index/1
  匹配结果是:
  controller  :  "Home"
  action     :  "Index"
  Id        :  "1"      对于Url  /a.b/c-d/e-f   匹配结果是:   controller  :  "a.b"   action     :  "c-d"   Id       :  "e-f" 

  为了Asp.net MVC框架的正常运行,框架要求使用一些特定的参数名称{controller}和{action}。

  假设我们想让所有的MVC请求都以site开头,那么路由我们可以改成这样

  site/{controller}/{action}/{id}

  假设想让所有的页面都以.aspx为后缀,则可以这样写

{controller}/{action}.aspx/{id}

  现在来将Global.asax.cs的路由复制出来解释一下

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // 路由的名称
                "{controller}/{action}/{id}", // 带参数的匹配规则
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 默认参数,即当不输入时间的处理方法
            );
        }

        protected void Application_Start()
        {        //这里还可以加一行        RouteTable.Routes.RouteExistingFiles = true;  //如果设为true,这行表示,该网站所有的HTTP请求都会使用RegisterRoutes()方法中定义的网址里有规则一一进行比对,如果对比成功就会用Asp.net Mvc进行处理,若对比失败,再检查磁盘上的文件。默认是false的,因为Html文件,css,js文件等可以优先不经过路由直接显示。
            AreaRegistration.RegisterAllAreas();
      
            RegisterGlobalFilters(GlobalFilters.Filters);        //注册前面定义的路由,所有的Asp.net MVCRouting都在此定义,其中参数RouteTable.Routes是一个公开的静态对象,存储了所有的Routing规则集(RouteCollection类)
            RegisterRoutes(RouteTable.Routes);
        }
    }

  1、IgnoreRoute  不理会的路由说白了就是用来定义不需要通过Routing处理的网址。

    例如:http://localhost/Trace.axd  

    OK,该条路径匹配成功{resource}.axd比对到Trace.axd。而{*pathInfo}比对到空。因此匹配成功。匹配成功就怎么样呢?Ignore,不处理。也就是,上面那条Url是不会被Asp.net MVC处理的。

  2、MapRoute()  最常用来定义Routing规则的辅助方法。用于定义一条路由。其中第一个参数是路由名称,第二个参数是Url以及参数,第三个是默认值。

  3、我们之前看到个  *  号,它表示Catch-All。即不管什么乱七八糟的东西都匹配。没有就匹配空。

  4、UrlParameter.Optional  指定可选参数的默认值,当不填写的时候,不会添加进参数字典。

二、自定义路由

routes.MapRoute(
    "Default", // 路由名称
    "{controller}/{action}/{id}/{age}/{birthday}", // 带有参数的 URL
    new { controller = "Home", action = "Index", id = UrlParameter.Optional ,
              age=18 ,birthday=new DateTime(1989,1,1) }, // 参数默认值
    );

public ActionResult Index( string id , int age , DateTime birthday)
{
    return View();
}    

  如果我们在路由中定义了定义好了包含这三个参数的模式,然后输入正确的URL后,路由系统就会自动从中提取出controller , action ,以及这三个参数(如果参数名匹配,并且能够完成类型转换的话)。

  例如,我们输入http://localhost/User/Getinfo/123344/24/1989-9-16 ,路由就会提取出一下信息 ,controller=User ,action = Getinfo,

id=123344 , age=24 ,birthday=1989-9-16

三、定义可变长度的参数的路由

 routes.MapRoute(
    "Default", // 路由名称
    "{controller}/{action}/{id}/{*catchall}", // 带有不定个数的参数的 URL
    new { controller = "Home", action = "Index",
    id=UrlParameter.Optional     }, // 参数默认值
);

  这个路由能匹配所有的URL。具体匹配情况如下图:

  

序号 URL 示例 映射结果
0 mydomain.com  controller=home,action=index
1 mydomain.com/Customer  controller=Customer,action=index
2 mydomain.com/Customer/List  controller=Customer,action=List
3 mydomain.com/Customer/List/All  controller=Customer,action=List,id=All
4 mydomain.com/Customer/List/All/Delete  controller=Customer,action=List,id=All,catchall=Delete
5 mydomain.com/Customer/List/All/Delete/Perm  controller=Customer,action=List,id=All,catchall=Delete/Perm

四. 定义命名空间的优先级

  根据以上内容我们已经知道,当URL匹配上一个路由之后,就会提取路由中的信息,然后进行进一步处理。假如现在我们的某个路由提取出了一个controller为Account ,并且我们的解决方案中有不只一个名为“AccountController”的类,由于路由并不知道要调用哪个controller ,这个时候就会出现错误。那么,如何解决这种问题呢?我们可以在注册路由的时候,指定某个路由有限查找controller 的命名空间,如下面的代码所示。

 routes.MapRoute(
    "Default", // 路由名称
    "{controller}/{action}/{id}", // 带有参数的 URL
    new { controller = "Home", action = "Index",
    id = UrlParameter.Optional }, // 参数默认值
    new string[] { "MyNamespace.Controllers" } //指定优先命名空间
);

五、路由约束

  我们可以给URL的匹配加上以下限制:

a, 正则表达式

b,HTTP method

  routes.MapRoute(
    "Default", // 路由名称
    "{controller}/{action}/{id}", // 带有参数的 URL
    new {
        controller = "Home",
       action = "Index",
       id = UrlParameter.Optional }, // 参数默认值
        //设置匹配约束
    new  {controller = "^H.*" , action ="^Index$|^About&" ,     //必须要被正则表达式成功匹配,才使用该路由
        httpMethod=new HttpMethodConstrain("Get") }   //指定只使用Get方法的请求才会被匹配
);

  这个路由就要求,controller的值必须是以字母"H"开头的,并且action只能是Index 或者 About ,并且只能用Get方式。

如果这些系统定义的约束条件不能满足项目的需求,我们可以自定义约束条件,只要实现 IRouteConstraint 接口 ,然后将该类的一个实例传给routs就可以了。代码如下:

public class UserConstrain : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route,
    string  parameterName,  RouteValueDictionary values,
    RouteDirection routeDirection)
    {
    return true ; //你可以在这里做具体的操作
    }
}

routes.MapRoute(
    "Default", // 路由名称
    "{controller}/{action}/{id}", // 带有参数的 URL
    new { controller = "Home", action = "Index", id
        =UrlParameter.Optional }, // 参数默认值
    new  {controller = "^H.*" , action ="^Index$|^About&" ,
        httpMethod=new HttpMethodConstrain("Get") ,
    customConstrain= new  UserConstrain () } , //设置匹配约束
    new string[] { "MyNamespace.Controllers" }  //指定优先命名空间
);
时间: 2024-11-06 12:49:02

MVC 路由规则的相关文章

【基础】MVC路由规则

一.RouteData解析过程 在ASP.NET MVC中,服务器收到来自客户端的请求后,会经过一些列的处理拿到请求的数据,比如在Pipeline 管线事件中,通过订阅适当的事件,将HttpContext作为参数传入HttpContextWrapper进行封装,然后取得当前路由集合的数据RouteData进行解析,拿到具体的参数,包括请求路径.请求的参数.IRouteHandler等,通过IRouteHandler的GetHttpHandler返回一个IHttpHandler对象,通过该对象对请

MVC路由规则以及前后台获取Action、Controller、ID名方法

1.前后台获取Action.Controller.ID名方法 前台页面:ViewContext.RouteData.Values["Action"].ToString(); ViewContext.RouteData.Values["Controller"].ToString(); ViewContext.RouteData.Values["ID"].ToString(); 后台页面:RouteData.GetRequiredString(&qu

MVC路由规则调试。

<1> 首先去我的腾讯微云里下载RouteDebug.dll文件 将文件下载下来后. 回到vs 右键 项目解决方案-->在windows资源管理器中打开文件夹->找到packages文件夹.这个文件夹就是放所有的第三方库的.不管是js库还是dll库都是放在这个文件夹中. 所以现在我们将下载下来的RouteDebug.dll文件放到这个文件夹中. 回到VS, 在MvcApplication应用程序下 选择"引用",将刚刚RouteDebug.dll文件应用进来.

ASP.NET MVC路由规则

1 是从上往下寻找路由规则的 2 如果上面的匹配了,则下面的不会匹配 3 假如域名是www.startpress.cn 路由规则是 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optiona

MVC路由规则

1 可以创建多条路由规则,每条路由规则的那么属性不同 2路由规则是有顺序的.如果被前面的规则匹配了,那么后面的规则就没机会了 3 constraints 约束: 4namespaces 命名空间 5route 对象:路由规则对象 6routedate 放url地址匹配上来路由规则后解析出来的数据 7routecollection 路由规则集合 8 routetable 路由表 静态的路由规则集合对象 9 urlroutemodule 注册了第7个事件指定了mvchendler 10 根据url地

MVC路由自定义及视图找寻规则

这篇关于MVC路由及视图规则本来是昨天要发的,但是本人真的有点懒,终于今天忍无可忍了.初学MVC的时候比现在还菜一点(现在也很菜),想着会用就行,但是有时还是会好奇,为什么它能找到控制器?为什么控制器return View();就能找到视图,而为什么视图一定要建在Views文件下?好像说的有点多了,接下来一边上例子,一边分析! MVC路由自定义 相信对于MVC路由的配置大家也都了解过一些,其实,这也不是本章的重点. 创建MVC项目的时候,根目录下>>App_Start>>Route

MVC之路由规则 (自定义,约束,debug)

自定义路由规则的要求,小范围写在前,大范围写在后.路由规则可以注册多条,路由规则的名称不能重复路由规则有顺序,并且按照顺序进行匹配,建议小范围写在前,大范围写在后.路由规则可以设置约束 即正则表达式路由规则匹配的控制器可以设置命名空间约束 routes.MapRoute( name: "NewShow", url: "{year}-{month}-{day}-{id}", defaults: new { controller = "News",

MVC的URL路由规则

Routing的作用:它首先是获取到View传过来的请求,并解析Url请求中Controller和Action以及数据,其次他将识别出来的数据传递给Controller的Action(Controller的方法).这是Routing组件的两个重要的作用! 下面我们从几个例子来讲解一下Url路由的使用. MapRoute()有6个方法可以重载,下面举5个例子相应介绍! 实例一:首先讲解的是系统默认提供的路由格式,下面是系统给的默认代码: public static void RegisterRou

MVC中url路由规则

Routing:首先获取视图页面传过来的请求,并接受url路径中的controller和action以及参数数据,根据规则将识别出来的数据传递给某controller中的某个action方法 MapRoute()有6个方法可以重载 方法1:系统提供的默认路由规则格式 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); r