Net Core教程

【ASP.NET MVC4】第十课:网址路由、自定义路由

本文主要是介绍【ASP.NET MVC4】第十课:网址路由、自定义路由,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

知识点:网址路由的概念、自定义路由

路由 - 源自网络中路由器的概念,负责网络中数据的传输路径。在 ASP.NET MVC 中,URL 路由模块负责从浏览器请求到特定的控制器动作的映射。任何一个请求都离不开路由,所以路由非常重要,理解路由的概念,我们将能理解 MVC 处理请求的整个过程,灵活地定义系统各种页面的访问规则。

 

1、网址路由概述

网址路由(URL Routing)并不是MVC中独有的,相对于 MVC 是独立的,单独存在的,它的定义在 System.Web.Routing 命名空间中,网址路由能为传统的 ASP.NET 应用程序服务,也能为 ASP.NET MVC 应用程序服务。网址路由在 ASP.NET MVC 中有两个主要用途,一是比对通过浏览器传递来的 HTTP 请求,二是将网址重写后返回给浏览器。

1.1  为什么要定义路由?

在项目开发中,定义路由( URL 访问规则)占用的开发量很小,但是非常重要,因为任何请求都离不开路由。

各个电商网站的 URL 使用非常灵活:

使用路由的好处:

  • 能够根据系统要求,灵活的划分请求规则(不同模块请求的 URL 是不一样的)

  • 屏蔽物理路径,提高系统的安全性,以上情况无法根据 URL 分析视图文件在站点目录中的位置

  • 有利于搜索引擎优化,可以将 URL 请求统一规范,以后维护中,如果页面发生变化,URL 可以保持不变

 

1.2   ASP.NET MVC 路由系统主要职责

路由是将来自浏览器的请求映射到 MVC 的 Controller Action ,从而返回网址路由。路由的体现有两部分,一是路由注册,二使请求映射。

路由注册:就是向路由表(RouteCollection)中添加路由。(也就是向 RouteConfig.cs 文件中添加路由)

请求映射:是当 HTTP 提出请求后,URL 会进行网址路由的比对,按照 ASP.NET MVC Routing 的规则,由上而下一条一条比对,直到比对到符合 HTTP 请求的网址为止。注意,所有的网址比对是从“http://localhost/”之后开始比对的。

 

1.3 回顾 ASP.NET MVC 的工作过程

新建一个 ASP.NET MVC 程序,程序一启动,就会调用全局应用程序配置类,在里面开始注册路由。路由表里的路由,都会即时的注册到服务器中。当用户发出请求时,要从路由表里进行查找,看符合哪一个路由规则,然后进行解析,找到控制器和动作方法,调用 Model 去完成,最后根据规则返回视图,再响应给用户。

 

2、 ASP.NET MVC 默认路由

新建一个默认的 ASP.NET MVC 应用程序,系统会默认的生成包含基本功能的应用程序,查看这些生成的代码,可以帮助我们更好的理解 ASP.NET MVC 。可以先研究一下以下文件代码:Web.config 、Global.asax 和 App_Start 文件夹里的 RouteConfig.cs 文件。

2.1  RouteConfig.cs 中的 URL 规则定义

URL 模式:

  • URL 中的参数值是:"{controller}/{action}/{id}" ,称之为 URL 模式。
  • 该模式是一种字符串,包括一些固定的“字符字面量”和“占位符”,占位符用大括号“{}”表示。
  • URL 模式规定了 URL 路径的定义规则。

 

2.2   使用自定义路由访问

示例练习1:使用自定义路由访问页面

第一步,新建一个空 ASP.NET MVC 项目,并在 Controllers 文件夹中添加一个 Home 控制器,给 Index 方法添加一个视图,在视图上写一句测试语句。

第二步,写自定义路由。方法:打开 App_Start 文件夹里的 RouteConfig.cs 文件。

关键代码:

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            //忽略处理ASP.NET的Web资源文件(程序默认写好的)
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");   

            //自定义一个路由规则(程序开发人员写的)
            routes.MapRoute(
                name: "Test1",
                url: "{first}/{second}/{third}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                constraints: new { first = "news", second = "show", third = 2 }
            );
            
            //路由规则(程序默认写好的)
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index",  id = UrlParameter.Optional }
            );
        }
    }

第三步,运行测试。程序运行后,在浏览器地址栏里,分别输入以下url信息,观察结果,并思考原因。

自定义路由

2.2.1   routes.MapRoute()方法的使用

使用 routes.MapRoute() 方法,定义路由,方法中的参数介绍(也可以在程序中,在方法名上右键“转到定义”查看方法的具体使用):

  • name:定义路由的名字,不能重复。
  • url:定义路由的URL模式。
  • defaults:默认值。
  • constraints:约束,是一组表达式,用于指定 url 参数的值。
  • namespace:命名空间,应用程序的一组命名空间。

 

2.2.2  routes.IgnoreRoute("{resource}.axd/{*pathInfo}")的作用

{resource}.axd 表示后缀名为.axd所有资源 如webresource.axd

{*pathInfo} 表示所有路径

作用:使路由系统忽略处理ASP.NET的Web资源文件(WebResource.axd或ScriptResource.axd).

 

2.2.3  UrlParameter.Optional 参数的作用

该参数可以作为路由参数的默认值。当需要让 "/Home/Index" 或 "/Home" 能正常匹配,但又不希望赋一个无意义的值,可以使用该参数。

 

2.2.4  多个路由的匹配的优先顺序

匹配第一个,后面的忽略

(参照示例中,自定义的路由,要放在上面,否则无法起作用)

 

2.3   URL 模式的语法相关

定义语法:{占位符1}字面量{占位符2}字面量…{占位符n}字面量n

  • 占位符可以是一个字符串或字符,比如"x" 、 "id" 、"year"等

  • 字面量可能是一个比较固定的字符,比较常见的是斜杠 "/"  ,也可以是字符串

举例:{table}/Details.aspx 、 News/{action}/{id}  、{pro}-{city}/{action}

注意:

 

2.4   URL 模式匹配产生路由数据的示例

在 ASP.NET MVC 路由系统中,RouteData 对象用来保存 URL 模式和实际 URL 匹配产生的路由数据。路由数据保存方式为:“键-值”对,RouteData 是视图基类和控制器基类的属性。

 

 

 

匹配要求:

  • 字面量:必须严格匹配,即实际请求中的字符串路由模式中的字面量字符串,必须要完全一致。
  • 大小写:URL 模式匹配的时候不区分大小写。
  • 常   量:没有包含在大括号内的信息,被作为常量对待。比如上面的 Blog ,以及在后面我们学习的分区项目中路由的定义Admin/{Controller}/{action}/{id}

{controller} 和 {action} 在程序运行中的映射:

 

2.5  路由匹配总结

2.5.1  关于{controller}/{action}

  • 必不可少:在一个实际的 MVC 系统中,{controller}/{action} 必不可少,如果缺少就会出现找不到路径而出错。
  • 约定规则:这个占位符是 MVC 里面约定的,并且会被解析成控制器和对应的方法。
  • 位置灵活:这两个约定的占位符,可以在任意位置。

2.5.2  其他占位符

  • 仅仅是占位:比如{aa}/{bb}/{cc},这里面的aa不能被解析成控制器,bb也不能解析成动作方法
  • 默认要求:一个路由中,如果没有规定{controller}/{action},或者只是规定其中之一,则没有规定的部分将使用默认值。

2.5.3  匹配顺序

  • 优先使用:多个路由匹配一个URL,则优先匹配的会使用
  • 尽量避免:定义多个路由时,尽量避免出现多匹配

 

 

=======这里是结束分割线========

这篇关于【ASP.NET MVC4】第十课:网址路由、自定义路由的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!