第13章 URL 路由

在引入MVC框架之前,ASP.NET假设在请求的URL与服务器硬盘上的文件之间有直接的关系。

在MVC情况下,请求是由控制器类中的动作方法处理的。

----------------------------------------------------------

注:路由系统没有任何控制器和动作的专门知识。它只是片段变量提取值,并把这些值沿着请求管道进行传递。在请求处理管道的

后面部分,当请求恰好到达MVC框架时,其才会被赋给controller和action变量。

注:默认情况下,路由系统在评估应用的路由之前,会考察一个URL是否匹配一个磁盘文件。

  当routes.RouteExistingFiles=true;  //对已存在的文件也进行路由,修改默认行为。

注:controlleractionarea是MVC框架的保留变量,对应请求进行服务的控制器、动作方法、区域。

----------------------------------------------------------

知识点:

  1.MvcRouteHandler类 是ASP.NET MVC应用程序定制路由的类。(new MvcRouteHandler())。

  2.MapRoute方法:专用于MVC应用程序。

  3.MapPageRoute方法:用于Asp.net Web Form应用程序。

4.HttpRequestBase、HttpContextBase、HttpResponseBase 支撑支持路由系统的MVC体系结构。

----------------------------------------------------------

一、路由系统的两个功能:

  1.考查一个输入URL,并推断出该请求想要的是哪个控制器动作方法Action。

  2.生成输出URL。这些URL是在视图渲染的HTML中出现的URL,以便用户点击链接时,调用特定的动作Action。

二、URL模式的两个关键行为:

  1.保守的:只匹配与模式具有相同片段的URL。(注意:默认值会使〈=片段数的URL与模式匹配)

  2.宽松的:只要具有正确的片段数,该模式就会用来为片段变量提取值。(注意:路由顺序)

三、默认值、静态URL片段、自定义片段变量、约束路由、对磁盘文件的请求进行路由

  1.默认值:当URL不包含与一个片段匹配的值时,便使用默认值。作为匿名类型的属性提供的。

       


//此路由将匹配0个(使用2个默认值Home,Index)、1个(使用1个默认值Index)、2个片段的URL

routes.MapRoute(
"MyRoute",
            "{controller}/{action}",
            new{controller="Home",action="Index"}   //为controller变量提供了一个Home默认值,为action变量提供了一个Index的默认值。
            );

  2.使用静态URL片段:创建具有静态片段的模式,静态片段只做为URL中的片段,与controller、action无关。请求时,还是通过MvcRouteHandler实例与url参数中的变量进行匹配。当url参数变量中没有{controller}或{action}时,必须在默认值匿名类中进行赋值。

  3.自定义片段变量:

routes.MapRoute(
"MyRoute",
"{controller}/{action}/{id}",
new{controller="Home",action="Index",id=UrlParameter.Optional} //id=UrlParameter.Optional 定义了id为可选URL片段
);

 

public ActionResult CustomMethod(string id="DefaultId") //在参数列表中给出默认值,这个比较常用
{
  ........

}

   

    当没有提供可选择片段的值时,会调用系统的默认值(默认值可以路由规则中初始化,也可能在动作方法中初始化)。

routes.MapRoute(
"MyRoute",
"{controller}/{action}/{id}",
new{controller="Home",action="Index",id="DefaultId"} //id="DefaultId"为默认值,但是一般不建议这么做,一般在方法中初始化
);

    可变长度路由:用"*catchall"片段变量来定义可变片段长度的支持。

routes.MapRoute(
"MyRoute",
"{controller}/{action}/{id}/{*catchall}",//可变长度匹配
new{controller="Home",action="Index",id=UrlParameter.Optional} //id=UrlParameter.Optional 定义了id为可选URL片段
);

   上述配置可以匹配任意长度的路由(一般放在路由表的最下面),第四个片段及之后的片段集都是RouteData.Values["catchall"]的值。

   命名空间区分控制器优先顺序:当控制器名称重复时,需要使用命名空间来决定优先顺序。

routes.MapRoute(
"MyRoute",
"{controller}/{action}/{id}/{*catchall}",//可变长度匹配
new{controller="Home",action="Index",id=UrlParameter.Optional}, //id=UrlParameter.Optional 定义了id为可选URL片段
new[]{"MyDemo.Controllers"} //优先调用的命名空间
);

  注:优先命名空间不是按在路由表中出现的顺序进行优先的。

    只考察指定命名空间时,应将DataTokens["UseNamespaceFallback"]=false;

Route myRoute=  routes.MapRoute(
"MyRoute",
"{controller}/{action}/{id}/{*catchall}",//可变长度匹配
new{controller="Home",action="Index",id=UrlParameter.Optional}, //id=UrlParameter.Optional 定义了id为可选URL片段
new[]{"MyDemo.Controllers"} //优先调用的命名空间
);

myRoute.DataTokens["UseNamespaceFallback"]=false;

    4.约束路由:正则表达式、指定值约束、HTTP方法约束、自定义约束

routes.MapRoute(
"MyRoute",
"{controller}/{action}/{id}/{*catchall}",//可变长度匹配
new{controller="Home",action="Index",id=UrlParameter.Optional}, //id=UrlParameter.Optional 定义了id为可选URL片段
new{controller="^H.*",  //以H字母开头的URL
action="^Index&|^about&", //action只能是Index 或 about
httpMethod=new HttpMethodConstraint("GET") //只接收以get方法
}
new[]{"MyDemo.Controllers"} //优先调用的命名空间
);

      自定义约束:通过实现IRouteConstraint接口

    5.对磁盘文件的请求进行路由:默认情况下,路由系统在评估应用程序的路由之前,会考察一个URL是否匹配一个磁盘文件。匹配就进行服务。

      为磁盘文件也进行路由:

routes.MapRoute(
     "diskFile",
     "Content/aaa.html",
    new{
         controller="Home",action="Index"
          }
);   

      routes.IgnoreRoute("content/{filename}.html");   //阻止匹配content/{filename}.html 所有的html文件,被路由进行评估。直接返回磁盘文件。

此方法是StopRoutingHandler类的一个实例,不是MvcRouteHanlder。当请求到IgnoreRoute 方法URL  模式得到匹配后,就不再进行后续路由表的匹配了。

    routes.IgnoreRoute方法遵循位置优先,所以放置的位置也同样重要。         

时间: 2024-10-14 19:55:14

第13章 URL 路由的相关文章

第13章 网络编程

1 /***************** 2 ***第13章 网络编程 3 *******知识点: 4 **************1.基本概念 5 ******************1.1 网络OSI模型 6 ******************1.2 IP地址 7 ******************1.3 端口地址 8 ******************1.4 通讯协议 9 **************2.Java网络相关类 10 ******************2.1 URLDe

跟我学ASP.NET MVC之十一:URL路由

跟我学ASP.NET MVC之十一:URL路由摘要: 在MVC框架之前,ASP.NET假定在请求的URLs和服务器硬盘文件之间有直接的关系.服务器的职责是接收浏览器请求,从相应的文件发送输出. 这种方法只能工作于Web表单,每一个ASPX页面既是一个文件,也是一个对应请求的自包含响应.而这对于MVC应用程序来说就无效了,因为请求是由控制器类里的行为方法处理的,而且没有磁盘上一对一关系的文件. ASP.NET平台使用路由系统处理MVC URLs.在这篇文章中,我将向你展示怎样为你的工程使用路由系统

JavaScript权威指南第13章 web浏览器中的javascript

13.1 客户端javascript window对象是所有的客户端javascript特性和api的主要接入点.表示浏览器的一个窗口,可以通过window对象来引用它. window 的方法 alert() prompt() confirm() 13.2 在html里嵌入javascript 4种方法: 内联:放置在<script></script>标签之中 外部引入:<script src="   "></script> html程序

MVC中的URL路由(一)

URL路由系统通过对请求地址进行解析从而得到以目标Controller名称为核心的路由数据.Url路由系统最初是为了实现请求url与物理文件路径分离而建立的,MVC的Url Route是将Url地址与物理文件映射转移到了目标Controller的映射. Url路由不是ASP.NET MVC特有的,而是建立在ASP.NET上面的,MVC的只是对这个路由的拓展使用(asp.net也开始使用这拓展了). 我们在App_Start文件夹中找到RouteConfig.cs的文件,打开看 1 public

Django 基础(一),项目创建,URL路由,数据库操作

一.安装Django 下载地址:https://www.djangoproject.com/download/ 1.tar zxvf Django-1.8.10.tar.gz 2.cd Django-1.8.10 3.python setup.py install 二.创建一个Django项目 django-admin startproject sitename 常用命令: python manage.py runserver 0.0.0.0 python manage.py startapp

PHP实现一个简单url路由功能

如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染.很多时候可能是这样子写:xxx.com/xx?c=x&m=x& t=..,而我们看到的url往往是这样子的(以新浪微游戏的咖啡恋人为例) game.weibo.com/ilovecoffee….这种URL设计看上去比前一种更好一点:) 如果我们访问一下不存在的游戏应用,例如game.weibo.com/ilovecoffee222,则会输出如下的错误提示: game.weibo.com后面匹配到的项,指向了某个php页面,然后根

第8章 三路由不同网段互通实验(中级篇)

第8章三路由不同网段互通实验( 中级篇) 一实验目的 学习如何给路由器接口配置网关.子网掩码 学习如何给路由器配置静态路由 学习如何在路由器上配置环回口 二实验工具 GNS3软件   http://yunpan.cn/cwkDa4MWJwiiV  访问密码 9b1a 思科IOS     http://yunpan.cn/cjDjwg4CXMxpw  访问密码 9c14 三实验描述 需要实现当192.168.20.0/24访问192.168.30.0/24网段时,数据是从R2到R3. 当192.1

《Cortex?-A系列编程者指南(V3.0)》第13章&lt;中断处理&gt;笔记

在本章,我们会看看ARM处理器处理中断的一系列方法,简单地看看通用中断控制器(Generic Interrupt Controller,GIC)架构. 旧版本的ARM架构允许实现者在他们的外部中断控制器设计中相当大的自由,没有关于中断类型或数量,或者是被用于中断控制模块接口的软件模型的协议.GIC架构提供一个更为严格的控制规范,使得来自不同制造商之间的中断控制器之间有更高程度的一致性.这使得中断处理代码变得更加可移植. 13.1 外部中断请求 如我们在第12章的异常类型中讨论的,所有的ARM处理

ASP.NET MVC5(一)—— URL路由

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 using System.Web.Mvc.Routing.Constraints; 7 using System.Web.Routing; 8 9 namespace UrlAndRoutes 10 { 11 public class RouteConfig 1