简单实例一步一步帮你搞清楚MVC3中的路由以及区域
我们都知道MVC 3 程序的所有请求都是先经过路由解析然后分配到特定的Controller 以及 Action 中的,为什么这些知识讲完了Controller Action Model 后再讲呢?这个东西我个人感觉比较的抽象吧!如如您有基础,看起来一点也不费力,如果您没有基础的话,您连Controller Action 都不知道是什么,那您怎么理解路由呢?嘿嘿仅仅是个人的看法!如果您还没有了解MVC 3 的一些基本的信息请您按照我下面的导航来,先了解MVC 3 的其他知识,然后再看下这篇文章。前面文章但凡涉及路由知识的东东都有对路由的简单的解释,对于不还不了解路由概念的人来说阅读下面这几篇文章没什么障碍。
1. ASP.NET MVC 3 初探
2. ASP.NET MVC 3 环境安装与配置
3. ASP.NET MVC 3 Razor 视图引擎 基本语法
4. ASP.NET MVC 3 Razor 视图引擎 布局
5. ASP.NET MVC 3 Controller
6. ASP.NET MVC 3 Model【通过一简单实例一步一步的介绍】
好下面咱就好好的说说路由Routing
第一 如果Routing 的命名空间是System.Web.Routing 在这说一下Routing不是MVC 3 独有的,在webForm中也可是使用。当然我没有使用过,不过大家做过项目的都使用过url重写吧!如果您还没有用到过url重写技术的话,证明您做的项目不需要 SEO 。
第二 Routing的作用:
1. 确定Controller 2. 确定Action 3. 确定其他参数(一般就是Action方法的参数了) 4. 根据识别出来的Controller Action 将请求传递给对于的Controller 和 Action 。
第三 Routing 是怎么工作的:
我们思考一个问题对于下面的这个url http://www.cnblogs/wlitsoft/blogs/123 为什么当我访问这个url的时候是怎么实现Controller 就是 wlitsoft Action 就是 blogs 参数就是123的呢?
好我们都知道MVC 3 项目的跟目录下有个全局文件(global.asax)当然webform 中也用这个文件,下面我们看看它和webform的有什么不同或者说它新加了什么方法。
1 Routes.MapRoute(
2 "Default", // 路由名称
3 "{controller}/{action}/{id}", // 带有参数的URL
4 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
5 );
我们会发现上面这几行代码。这几行代码就定义了一个路由匹配规则,下面我们将一下具体的参数是什么意思。
- name 参数:规则名称,不可以重复,即路由名必须是唯一的。
- url 参数: 将要识别的参数括起来即可, 比如: {controller}/{action}/{id} 这里的{}就是占位符 您可以这样理解大家都用过string类的Format方法吧!
例如:string.Format("{0}aaaa{1}bbb",“1”,“2”); 怎么样明白了吧!
- defaults 参数:url参数的默认值,当我们新建了一个mvc 项目的时候当运行浏览可以看到地址栏没有任何的参数只有一个比如http://localhost:32112/ 它什么就转向了home下的index页面呢?这就是这个参数的作用了,它可以定义默认的controller action 以及 id参数 这个还得说一下您看上面的代码为什么id不给一个具体的值而是给一个UrlParameter.Optional 呢 这个呢 因为您不能保证id的类型是 int 的还是 stirng 等等 ,写id= UrlParameter.Optional 它会根据id的类型还具体的指定什么类型的默认值比如 int型的就是0吧!
- constraints参数: 这个参数在再上面的代码中没有出现 我先提前说下 然后一会儿咱再看代码吧!
这个参数的作用是用来限定每个参数的规则或http请求的类型constraints属性是一个RouteValueDictionary对象,也就是一个字典表, 但是这个字典表的值可以有两种:1.用于定义正则表达式的字符串。正则表达式不区分大小写 2. 一个用于实现 IRouteConstraint 接口且包含 match 方法的对象。
例如:通过正则表达式可以规定参数格式,比如controller 参数只能是4位数字。
new { controller = @"\d{4}"}
通过第IRouteConstraint 接口目前可以限制请求的类型。
例如:比如限制一条路由规则只能处理GET请求:
httpMethod = new HttpMethodConstraint( "GET", "POST" )
第四 怎么优化url
对于一个网站来说为了SEO友好,一个url层数不要超过3层:但是按照我们默认的匹配规则{controller}/{action}/{id} 它是3 层以及不符合SEO了怎么办呢?稍微修改下就ok了看怎么修改{controller}/{action}-{id} 我们都知道C#的命名规则是字母数字下划线不能以字母开头,所以{action}-{id} 映射出来的url 不会被匹配成一个变量。
第五 路由匹配是有优先级的
路由匹配是有优先级的也就是说您定义路由规则的的时候是有顺序的,假如您定义了一个非常复杂的路由但是您放在了最下面,恰巧呢上面的路由规则有符合的那您就挂了,永远不会匹配到您定义的那个路由。怎么办捏 把不容易匹配的路由放在最上面,把最容易匹配的路由放在最下面,这里我还得说一点 有个路由能匹配所有的url什么呢 看下面代码
{*AllUrl}
第六 区域 area 比如 一个管理系统 都有后台功能吧!但是我们想让后台管理这块和网站前台分开或这说后台管理这快存再一个单独的web.config 配置文件怎么办呢?这里区域的概念出来了我们首先新建一个区域。
完事后会看到一个AreaAdminAreaRegistration.cs 文件 打开它
复制代码
1 public override void RegisterArea(AreaRegistrationContext context)
2 {
3 context.MapRoute(
4 "AreaAdmin_default",
5 "AreaAdmin/{controller}/{action}/{id}",
6 new { action = "Index", id = UrlParameter.Optional }
7 );
8 }
复制代码
重写了一个方法 那 全局文件中怎么识别呢 ? 看下全局文件
1 protected void Application_Start()
2 {
3 AreaRegistration.RegisterAllAreas();
4
5 RegisterRoutes(RouteTable.Routes);
6 }
第3行是不是定义了 所以 区域这个路由规则除了前面加了一个AreaAdmin 区域名 和其他的没有任何的区别了吧!下面我们新建一个Controller 比如AdminHome 我们先避免和以前的Controller重名一会儿再说为什么。看下运行结果
很正常吧!但是如果我要新建一个HomeController 呢 就是 建一个 以前前台有过的Controller ,运行一下
也没问题是吧!好下面咱再访问一下另一个homecontroller 就是 前台的那个,看下出什么异常
出问题了是吧!因为程序中存在两个HomeController 它不知道要访问哪个!,所以根据错误提示我们还得再原有的路由中加点东西 加个namespace。区分一下两个HomeController
new string[] { "_2012_6_16Mvc2Test.Controllers" }
ok 搞定。
第七 路由测试
我们不能保证自己写的路由规则一定能被匹配到 好下面介绍一个工具专为分析路由匹配的叫什么呢 叫RouteDebug
首先引入dll 然后再在全局文件中的Application_Start() 方法里加入如下代码
RegisterRoutes(RouteTable.Routes);
RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
一切搞定 运行一下吧!
简单实例一步一步帮你搞清楚MVC3中的路由以及区域的更多相关文章
- ASP.NET MVC 3 Model【通过一简单实例一步一步的介绍】
今天主要讲Model的两个方面: 1. ASP.Net MVC 3 Model 简介 通过一简单的事例一步一步的介绍 2. ASP.Net MVC 3 Model 的一些验证 MVC 中 Model ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务
我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定
如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...
- 一步一步搭建11gR2 rac+dg之配置单实例的DG(八)【转】
RAC主库配置单实例ActiveDataguard 本文文档结构: 这里配置的过程中需要注意的一项是多看看rac1和rac2以及dg的告警日志会对配置过程有更深刻的理解...配置oracle rac的 ...
- 一步一步学Silverlight 2系列(32):图形图像综合实例—“功夫之王”剧照播放
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例
在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流
在一般的互联网应用中限流是一个比较常见的场景,也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现,也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容
上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...
- 一步一步学习SignalR进行实时通信_1_简单介绍
一步一步学习SignalR进行实时通信\_1_简单介绍 SignalR 一步一步学习SignalR进行实时通信_1_简单介绍 前言 SignalR介绍 支持的平台 相关说明 OWIN 结束语 参考文献 ...
随机推荐
- JS 获取 路径参数 传入 参数名 截取 & 和 # 之前 字符
function getQueryStringByName(name) { var result = location.search.match(new RegExp("[\?\&] ...
- PHP初学留神(五)·小结
来学习快两个月了,这周末即将回家开始写论文.那么走之前,好好总结一下这两个月的所学所得吧.这段时间,在实验室里做的Web开发主要涉及到了web开发的一些框架内容以及php基础知识.思维导图记录如下. ...
- 换行符‘\n’和回车符‘\r’
顾名思义,换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符 '\n' 10 换行(newline)'\r' 13 回车(return) 也可以表示为 ...
- Html学习_style属性应用
用style属性改变字体大小.颜色.字体.背景颜色和对齐方式 <!DOCTYPE html> <html> <head> <title>Putting ...
- C#细节忽略的问题:int 与 int?
int 与 int? 天天都在看,却不知道这2有什么区别呢? 首先说明下这个?的由来吧:C#值类型使不可谓null的,但是sql server的 int 确是可以为null的. 废话不多说直接上代码 ...
- Delphi XE5 android 图解为Android应用制作签名
本文摘自 http://redboy136.blog.163.com/blog/static/107188432201381872820132 要发布android应用,必须做签名的.看一下具体的操作 ...
- Servlet实现文件上传
一.Servlet实现文件上传,需要添加第三方提供的jar包 下载地址: 1) commons-fileupload-1.2.2-bin.zip : 点击打开链接 2) commons- ...
- input标签文字点击变颜色
<input type="text" class="ser_input"value="从这里搜索(^_^)" onfocus=&quo ...
- Linux系统备份与还原
在使用Ubuntu之前,相信很多人都有过使用Windows系统的经历.如果你备份过Windows系统,那么你一定记忆犹新:首先需要找到一个备份工 具(通常都是私有软件),然后重启电脑进入备份工具提供的 ...
- Asp.net MVC 视图之公用代码
一.公共模板 转自:http://www.cnblogs.com/kissdodog/archive/2013/01/07/2848881.html 1.@RenderBody() 在网站公用部分通过 ...