话题:请求从路由开始

在实际的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简单编程之(二)经典路由篇的更多相关文章

  1. ASP.NET MVC学习(一)之路由篇Route

    什么是路由 通过[路由]配置,路由可以规定URL的特殊格式,使其达到特殊效果. 在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法 ...

  2. 【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--自动路由篇(1/8)【route】

    文章目录 前情概要 在使用express框架开发的时候,每加一个请求,都在增加一条route请求规则,类似于下面的代码,很烦有木有! app.use('/myroute path', (req, re ...

  3. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...

  4. Asp.net mvc 知多少(二)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  5. ASP.NET MVC 简单介绍①

    ASP.NET  MVC 简单介绍① 只做了重要描述,内容出自菜鸟教程网站内容. 目录 1布局 2HTML 帮助器 3.Razor 语法 4.添加样式 5.Layout 6. Controllers ...

  6. ASP.NET MVC案例教程(二)

    ASP.NET MVC案例教程(二) 让第一个页面跑起来 现在,我们来实现公告系统中的第一个页面——首页.它非常简单,只包括所有公告分类的列表,并且每个列表项是一个超链接.其中分类数据是用我们的Moc ...

  7. ASP.NET MVC学习笔记(二)笔记

    接下来我们一起了解ASP.NET MVC的最重要的核心技术,了解ASP.NET MVC的开发框架,生命周期,技术细节. 一.Routing与ASP.NET MVC生命周期 1.Routing——网址路 ...

  8. ASP.NET MVC 简单事务添加

    ASP.NET MVC 简单事务 //实例化查询上下文 using ( BookStoreEntities db = new BookStoreEntities()) { //找到需要价格和名称的数据 ...

  9. ASP.NET MVC 简单分页代码

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

随机推荐

  1. unity3d - new 不出的单例

    可能习惯了写单例的朋友,或者常规的单例模式 会这样做 private static Single instance; public static Single Instance(){ if (inst ...

  2. C# 获取地址栏的地址(URL)

    原文地址:http://blog.csdn.net/dingxingmei/article/details/8448009 设当前页完整地址是:http://www.jb51.net/aaa/bbb. ...

  3. jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门

    一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...

  4. Unicode explorer

    It can be cumbersome to work out some of the details of this by hand, so you can use the little Java ...

  5. javascript arguments与javascript函数重载

    1.所 有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数.他不是一个数组,如果用typeof arguments,返回的是’object’.虽然我们可以用调用数据的方法来调用 ...

  6. MySQL下划线特殊字符(Like 语句)

    最近用了MySQL+ibatis 做项目 问题描述: 在SQL里 用到了 a.name like ##%searchName%## searchName=test_1 发现出来的结果: test_1, ...

  7. sql sever 2008修改数据类型

    如果是新表,直接在表中修改: 如果不是新表,则须sql语句修改 附sql语句 alter table 表名 alter column 列名 新的数据类型

  8. java动态加载类和静态加载类笔记

    JAVA中的静态加载类是编译时刻加载类  动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子  现在我创建了一个类  实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...

  9. linux下如何开启oracle服务和开启监听

    su - oracle  切换到oracle用户模式下 sqlplus /nolog  //登录sqlplus SQL> connect /as sysdba  //连接oracle SQL&g ...

  10. JS-怎么得到局部域中的数据

    1,使用全局变量 var str = '';function fn1(){    var a = '大鸡腿~';    str = a;} 2,使用一个局部函数 function fn2(){     ...