ASP.NET MVC简单编程之(二)经典路由篇
话题:请求从路由开始
在实际的ASP.NET MVC开发中,URL访问规则----路由的定义是非常重要的。因为任何一个请求都离不开路由。理解它,我们将能理解MVC处理请求的整个过程,灵活地定义系统各种页面的访问规则。
1.1为什么需要路由
我们先来看一个最简单的案例:
示例1:
routes.MapRoute(
Name:”Default”,
Url:”{controller}/{action}/{id}”,
Defaults:new {controller=”Home”,action=”Index”,id=UrlParameter.Optional}
);
我们知道之所以可以通过”/Home/Index/0”、“/Home/Index”、”/Home/”和”/”访问同一个页面,就是由于路由存在的原因,同时这也体现了ASP.NET MVC路由系统的威力。
1.2路由优点
01.屏蔽物理路径,提高安全性
当我们使用了路由后, 从请求的URL本身无法分析出代码文件在站点目录中的位置,一定程度上提高了文件的安全性。例如,从”Home/Index/1”是无法判断出视图文件在站点中的物理位置的。
02.有利于搜索引擎优化
我们知道,对于一个在互联网上运行的Web系统而言,网页方便被搜索引擎收录,并有较高的排名,往往是一个很重要的需求,因为它直接和money挂钩。不同结构的URL对于搜索引擎来说,优先级是不一样的。利用ASP.NET MVC的路由系统,完全可以灵活地定义URL形式,来迎合搜索引擎优化的需求。
1.3如何定义路由规则
既然我们知道了路由存在的价值,下面我们就来看下如何定义路由规则。
1.3.1基于模式匹配的路由规则
在示例1中,MapRoute()中的URL参数值是”{controller}/{action}/({id}”,称之为URL模式,该模式是一种字符串,包括一些固定的字符字面量和占位符。
语法:{占位符1}字面量1{占位符n}字面量n
所谓字面量一般是“/”,但是也可以是字符串,如”pageIndex”等。
ASP.NET MVC将定义的URL模式和实际的URL进行匹配,这里我们看如下案例:
URL模式:{language}-{country}/{action},能与之匹配的URL是/zh-cn/display或者
/en-us/list。
注意点:
1.URL模式匹配不区分大小写。
2.两个占位符之间不能连续,不允许出现{para1}{para2}这样的情况,即两个占位符之间没有任何字面量。
3.“/”和一般的字面量相比,是比较特殊的。实际匹配情况是,首先按“/”把URL模式分成各个片段,然后匹配各个片段和URL。
1.3.2路由数据
在ASP.NET MVC路由系统中,提供了RouteData对象。RouteData对象用来保存URL模式和实际URL匹配产生的路由数据,这些路由数据以键-值对的形式保存。如下
|
路由模式 |
匹配的URL示例 |
路由数据 |
|
{Controller}/{action}/{id} |
/Books/Edit/1 |
Key=Controller,Value=Books Key=action, Value=Edit Key=id,Value=1 |
在action和视图中都可以获取RouteData中的数据,视图的基类和控制器的基类将RouteData对象封装成了名为RouteData的属性,用法如下所示:
//在动作方法中使用RouteData
String id=RouteData.Values[“id”];
<!—在视图中使用RouteData-->
<%= RouteData.Values[“id”]%>
其中,RouteData.Values是RouteValueDictionary类型,它是一种字典结构。
1.3.3特殊的路由模式
1)*匹配
*用来匹配URL的剩余部分,如URL模式“{controller}/{action}/{query}/{*plus}”匹配的URL,产生的部分路由数据如下:
|
序号 |
路由模式 |
路由数据 |
|
1 |
/Home/Index/select/a/b |
Key=plus,Value=a/b |
|
/Home/Index/select/a/b/c |
Key=plus,Value=a/b/c |
|
|
/Home/Index/select/ |
Key=plus,Value= |
2)贪婪模式
在URL模式和实际的URL匹配过程中,可能会出现多种情况,造成产生的路由数据不确定。例如,对于“{filename}.{ext}”这样的URL模式,如果匹配“/food.xml.aspx”,则会产生下面两种情况的路由数据。
key=food,value=xml.aspx
或者
key=food.xml,value=aspx
事实上,只会产生后面这种情况的路由数据,在模式匹配过程中,寻找字面量”.”的位置,不会在找到第一个点后就放弃,而是贪婪地寻找到最后一个点为止,这就是贪婪匹配规则。
扩充:所谓贪婪模式就是尽可能多的匹配符合规则的内容。
1.3.4路由的默认值
我们看如下代码
Routes.MapRoute(“Default”,”{controller}/{action}/{id}”,new {action=”index”,id=0});
匹配的URL,如”/Home”、”/Home/Index”、”Home/Index/2”,不匹配的URL,如”/”,因为Controller没有值。
当路由中含有默认值时,必须注意以下两点。
1) 只提供中间参数的默认值不起作用
当URL模式中包含多个占位符时,只提供中间几个占位符的默认值,默认值是不会起任何作用的。
|
URL模式 |
默认值 |
不匹配URL示例 |
匹配URL示例 |
|
{controller}/{action}/{id} |
Action=”index” |
/home/0 |
/home/index/2 |
2)包含字面量时默认值不起作用
当URL模式中包含除“/”之外的字面量时,为占位符定义的默认值可能不起作用。
|
URL模式 |
默认值 |
不匹配URL示例 |
匹配URL示例 |
|
{controller}/{action}+{id}/{no} |
Controller=”home” Action=”index” Id=”0” No=”0” |
/ /home /home/index /home/index+ |
/home/index+1 /home/index+10/12 |
1.3.5路由约束
有时候,URL的形式可能是/2013/12/15这样的格式,为了防止出现/2013/12/你好,这样的非法请求,我们可以对路由的参数进行约束。其中,MapRoute()的一个重载方法Constraints参数提供了正则表达式的赋值。

今天暂时到这里,以后陆续补充后续内容以及路由知识。-----微冷的雨出品
ASP.NET MVC简单编程之(二)经典路由篇的更多相关文章
- ASP.NET MVC学习(一)之路由篇Route
什么是路由 通过[路由]配置,路由可以规定URL的特殊格式,使其达到特殊效果. 在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法 ...
- 【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--自动路由篇(1/8)【route】
文章目录 前情概要 在使用express框架开发的时候,每加一个请求,都在增加一条route请求规则,类似于下面的代码,很烦有木有! app.use('/myroute path', (req, re ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...
- Asp.net mvc 知多少(二)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- ASP.NET MVC 简单介绍①
ASP.NET MVC 简单介绍① 只做了重要描述,内容出自菜鸟教程网站内容. 目录 1布局 2HTML 帮助器 3.Razor 语法 4.添加样式 5.Layout 6. Controllers ...
- ASP.NET MVC案例教程(二)
ASP.NET MVC案例教程(二) 让第一个页面跑起来 现在,我们来实现公告系统中的第一个页面——首页.它非常简单,只包括所有公告分类的列表,并且每个列表项是一个超链接.其中分类数据是用我们的Moc ...
- ASP.NET MVC学习笔记(二)笔记
接下来我们一起了解ASP.NET MVC的最重要的核心技术,了解ASP.NET MVC的开发框架,生命周期,技术细节. 一.Routing与ASP.NET MVC生命周期 1.Routing——网址路 ...
- ASP.NET MVC 简单事务添加
ASP.NET MVC 简单事务 //实例化查询上下文 using ( BookStoreEntities db = new BookStoreEntities()) { //找到需要价格和名称的数据 ...
- ASP.NET MVC 简单分页代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
随机推荐
- 终极优化_详解Win7旗舰版系统中可以关闭的服务
Win7旗舰版系统是一款功能强大的系统,不过对于很多用户很多功能却使用不上,而支持功能的很多服务也多少占用了系统资源,那么我们可以通过关闭一些不使用的服务来达到让win7系统运行速度加快的目的.下面小 ...
- sql中列数据横着显示
列数据横着显示:CREATE TABLE StudenScore(stuname VARCHAR(25) , kc VARCHAR(25) , fs INT)INSERT INTO StudenSco ...
- Linux socket 获得本地IP和广播地址
#include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <netine ...
- Hibernate 一级二级缓存
1.一级缓存与session关联,session关闭时,缓存数据消失: 2.一级缓存无法自我控制缓存的数量,需考虑缓存溢出: 3.二级缓存与sessionFactory关联,当sessionFacto ...
- html+css-----补
其实html没什么好补充的了,主要是使用css如何构造出各种想要的效果 1.加减框 <!DOCTYPE html> <html lang="en"> < ...
- Redis过期时间
上次开发用了redis后效果不错,后来在进阶的开发中查询到,如果redis一直不释放也会占用内存,于是就想着给redis加上个过期时间. 具体操作很简单,只要在设置redis的时候加上exp就可以了, ...
- FIFO跨时钟域读写
今天面试,要走时问了我一个问题:如果两个时钟一个时钟慢一个时钟快,来读写FIFO,其中读出的数据是 连续的一段一段的. 图1 图1为写时序控制,可以看出数据是两个时钟周期的长度,当然实际中可以是任意周 ...
- php设计模式学习之观察者模式
什么都不说,先看代码: interface userOperateImpl { public function operate($username); } class userLoginLog imp ...
- Rsync+inotify实现实时同步
1.1 inotify介绍 inotify是一种强大的.细粒度的.异步的文件系统事件控制机制.linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加.删除. ...
- Sql Server 复制表
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句 1.INSERT INTO SELECT语句 语句形式为:Insert into Table2(field1,fiel ...