ASP.NET MVC4学习笔记路由系统概念与应用篇
一.概念
1.路由是计算机网络中的一个技术概念,表示把数据包从一个网段转发至另一网段。ASP.NET中的路由系统作用类似,其作用是把请求Url映射到相应的"资源"上,资源可以是一段代码或具体的Web页面.路由系统提供了一种简单抽象机制,让我们利用Url更加精简方式表示资源,而无关资源具体的实现或表示。
2. 路由系统包含一系列重要的概念,现介绍如下:
路由规则(RouteBase): 表示其中具体的一条路由条件,如果满足该路由条件,则转发至该路由处理. 路由规则由路由名称,路由默认值,Url路由模式,约束,附加数据这几部分组成
路由表(RouteCollection): 路由规则的集合
路由数据(RouteData): 表示路由匹配的结果,包含当前路由的数据
路由处理(IRouteHandler): 表示路由处理,返回一个IHttpHandler处理当前请求
3.路由与Url重写的区别
Url重写从设计目的来说是把一个Url映射到另一个Url, 功能比较单一,路由是把Url映射一个系统资源,另外,路由系统也支持生成Url, 通俗说支持双向"路由".
二.应用
1. 为请求Url 检查路由匹配
新建一个ASP.NET MVC4 Internet项目,在App_Start目录RouteConfig.cs 有如下代码:
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 }
);
}
routes.IgnoreRoute 表示忽略特定的请求
routes.MapRoute 表示为系统添加一条的规则,name表示路由名称是Default, url表示路由模式是{controller}/{action}/{id}, 括弧中表示一个"段",
defaults表示路由默认值, 如果相应的段在请求Url中不存在但有默认值则取默认值 ,id 表示可选参数
该条路由匹配以下url :
http://localhost/ controller = "Home", action = "Index"
http://localhost/Home controller = "Home", action = "Index"
http://localhost/Home/Get controller = "Home", action = "Get"
http://localhost/Home/Get/1 controller = "Home", action = "Get", id = "1"
假设有下一个场景,要查询某一分类某年某月某天的报表,我们设计Url模式为/Category/year/month/dd,具体的如下代码
routes.MapRoute(
name: "Report",
url: "{Category}/{year}/{month}/{dd}",
defaults: new { controller = "Report", action = "Index", year = UrlParameter.Optional,
month = UrlParameter.Optional, dd = UrlParameter.Optional},
constraints: new { method = new HttpMethodConstraint("GET"), year = @"\d+"}
);
这条路由包含了约束条件, 约束条件可以是正则表达式或实现了IRouteConstraint接口的对象
2. 根据路由上下文件数据生成Url
UrlHelper.Action 和 HtmlHelper.ActonLink 分别根据controller/action生成Url和链接
UrlHelper.RouteUrl 和HtmlHelper.RouteLink 根据特定路由生成Url和链接
另外RouteCollection 两个静态属性影响生成Url
LowercaseUrls 表示生成的Url是否小写形式
AppendTrailingSlash 表示是否在生成的Url添加"/" 以标准化
三. 路由系统其它特性
1. 是否对物理文件路由 RouteCollection.RouteExistingFiles ,默认情况下为false
2. 忽略特定的请求模式 通过IgnoreRoute方法注册相应的模式,该路由一个特殊的处理类,叫做StopRoutingHandler
3. 路由调试 路由调试组件需要另外安装,打开包管理控制台,执行 Install-Package routedebugger命令。通过该组件你可以在页面看到详细的路由匹配情况,另外安装会在Web.config中添加一个配置项<add key="RouteDebugger:Enabled" value="true" />, 设为false禁用路由调试
四. 区域路由(Area)
ASP.NET MVC提供了区域功能帮助更好的组织网站结构,每个区域都是完整的ASP.NET MVC系统
在大型Web系统中,也许要特定的模块组织网站逻辑架构, 比如一个订单管理系统,可以分成Customer,Products, Orders 等几个区域分别开发
五. 路由扩展
通过实现抽象类RouteBase, IRouteHandler和IHttpHandler接口,可以对路由系统进行扩展,比如如下该列子
http://www.cnblogs.com/luanwey/archive/2009/08/12/1544444.html 实现二级域名
ASP.NET MVC4学习笔记路由系统概念与应用篇的更多相关文章
- ASP.NET MVC4学习笔记路由系统实现
一.路由实现 路由系统实际是一个实现了ASP.NET IHttpModule接口的模块,通过注册HttpApplication的PostResolveRequestCache 事件对Url路由处理.总 ...
- asp.net mvc4 学习笔记一(基本原理)
做了8年的asp.net webform,用过MVVM但还没用过MVC , 虽然项目不用MVC,但是还是想了解一下,今天第二天学习,以下是学习心得. VS2012默认带有asp.net mvc3和as ...
- ASP.NET MVC4学习笔记之Controller激活的扩展
一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Control ...
- ASP.NET MVC4学习笔记之Controller的激活
一. 高层相关类说明 当路由系统根据请求Url收集路由信息后,下一步就要将路由信息传给Controller激活系统,Controller激活系统负责实现了IController接口的Controlle ...
- ASP.NET MVC4学习笔记之总体概述
断断续续使用ASP.NET MVC框架也有一年多了,也算积累了一些经验,唉,一直想写一些笔记好好总结一下,人太懒不想动笔,今天终于决定开始.希望自己能坚持下去. 这篇文章大体介绍ASP.NET MVC ...
- ASP.NET MVC4学习笔记
一.MVC简介
- Asp.net core (学习笔记 路由和语言 route & language)
https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换
路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...
- Symfony2 学习笔记之系统路由
mfony2 学习笔记之系统路由 漂亮的URL绝对是一个严肃的web应用程序必须做到的,这种方式使index.php?article_id=57这类的丑陋URL被隐藏,由更受欢迎的像 /read/ ...
随机推荐
- [Arduino] Leonardo 中文介绍
以下内容均翻译自arduino.cc,水平有限,如有错误请大家指正. 概述Arduino Leonardo是基于ATmega32u4一个微控制器板.它有20个数字输入/输出引脚(其中7个可用于PWM输 ...
- Java Collection集合接口
Collection接口是赖以集合框架建立的基础.它声明的所有集合的核心方法.这些方法概括于下表中. 因为所有集合都要实现Collection,熟悉它的方法是对框架有清晰的认识很有必要.这几种方法都可 ...
- SQL Server之内连接 左连接 右连接 全连接 交叉连接
SELECT * FROM Table_A GO SELECT * FROM Table_B GO --内连接 SELECT a.*, b.* FROM Table_A a JOIN Table_B ...
- 关于Navicat Premium导入xlsx的问题
这段时间由于工作需要,频繁通过Oracle导入/导出大量数据,测试了很多软件,都不理想.PL/SQL Developer导入.导出都卡死:Oracle SQL Developer也是导入.导出都卡的半 ...
- 控制语句(if-else+循环+switch)汇编规则
[1]说说条件码 最常用的的条件码有: CF:进位标志 (无符号溢出) ZF:零标志 SF:符号标志(结果为负数) OF:溢出标志 (补码溢出, 有符号溢出) [2]有两类指令设置条件码而不改变任何其 ...
- 查看centos中的用户和用户组
用户列表文件:/etc/passwd 用户组列表文件:/etc/group 查看系统中有哪些用户:cut -d : -f 1 /etc/passwd查看可以登录系统的用户:cat /etc/passw ...
- javascript进阶-原型prototype
一.javascript原型认识 很多编程语言都有类的概念,我们可以拿原型和类进行比较,看看它们之间的区别以及相同点在哪里. 1.类:类是一个具体事物的抽象所以类是一个抽象的东西,在面向对象中类可以用 ...
- 六.CSS浮动与清除
浮动 把元素从常规文档流中取出.是元素脱离常规文档流 浮动的作用: ①实现文本绕排图片效果 ②让原本在上下方向上堆叠的块级元素可以变成左右并列,从而实现多栏布局 文本绕排图片 首先HTML代码如下 & ...
- 总结一下block的几种常用方法
一.block的简单介绍 block相当于一个参数,有参数的名,有参数的值,有参数的使用,当使用block的时候,它又相当于一个函数,会回调函数体. 声明:void (^block)(void); 实 ...
- Swiper API
本文分享自 http://www.cnblogs.com/scavengers/p/3760449.html 最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,欢迎 ...