简单实例一步一步帮你搞清楚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();

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);

一切搞定 运行一下吧!

时间: 2024-10-07 22:48:50

简单实例一步一步帮你搞清楚MVC3中的路由以及区域的相关文章

一步一步学习SignalR进行实时通信_1_简单介绍

原文:一步一步学习SignalR进行实时通信_1_简单介绍 一步一步学习SignalR进行实时通信\_1_简单介绍 SignalR 一步一步学习SignalR进行实时通信_1_简单介绍 前言 SignalR介绍 支持的平台 相关说明 OWIN 结束语 参考文献 前言 本来前几个月想写一系列的关于SignalR的文章,但是由于在做项目,时间非常的紧急,花了1天的时间大致了解了下SignalR,并实现了个在线聊天的小功能,本来记录一系列关于SignalR的文章,没想到写了MVC5使用SignalR进

一步一步写一个简单通用的makefile(三)

上一篇一步一步写一个简单通用的makefile(二) 里面的makefile 实现对通用的代码进行编译,这一章我将会对上一次的makefile 进行进一步的优化. 优化后的makefile: #Hellomake #Magnum, 2014-10-20 # 指令编译器和选项 CC=gcc CFLAGS=-Wall # 需要链接库的库名,比如libm.a,就是-lm,需要去掉前面的lib和后面的.a LIBS=-lm # 设置默认搜索头文件的路径,优先是这个,然后是系统路径 IncludeDir

一步一步跟我学习lucene(14)---lucene搜索之facet查询原理和facet查询实例

Facet说明 我们在浏览网站的时候,经常会遇到按某一类条件查询的情况,这种情况尤以电商网站最多,以天猫商城为例,我们选择某一个品牌,系统会将该品牌对应的商品展示出来,效果图如下: 如上图,我们关注的是品牌,选购热点等方面,对于类似的功能我们用lucene的term查询当然可以,但是在数据量特别大的情况下还用普通查询来实现显然会因为FSDirectory.open等耗时的操作造成查询效率的低下,同时普通查询是全部document都扫描一遍,这样显然造成了查询效率低: lucene提供了facet

一步一步实现MVC5+EF6+Bootstarp+Autofac+NoSql实现OADemo 之登陆(一) 验证码 Captcha 之大插件小用

不知何年何月才能完成OADemo啊,总之还是一步一步来吧,这段时间开始着手了,先做登陆.  前段时间研究了一下在CentOS7下安装Mysql和Memcached服务,并测试了用C#操作,结果还行. 今天做一个简单的基于Bootstarp的响应式登陆页面(其实是在网上下的模板),不管是登陆还是注册吧,都会用到验证码,以前是用GDI绘出来的,觉得太丑了,百度的关于.net的验证码绝大多数也是用的这种方法,最后试了一下captcha,觉得还挺好看的,所以就试着用用. nugit控制台install-

jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、

脚 本 之 家 www.jb51.net 脚本云 专题 素材下载 电子书 软件下载 源码下载 服务器常用软件 a5交易 首页 网页制作 脚本专栏 脚本下载 网络编程 数据库 CMS教程 电子书籍 平面设计 媒体动画 操作系统 网站运营 网络安全 YUI.Ext相关 prototype jquery dojo json lib_js js面向对象 extjs Mootools Seajs 其它 特色栏目: vbscript 正则表达式 javascript 批处理 服务器软件 素材下载 低价出售流

【DG】[三思笔记]一步一步学DataGuard

[DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)......................Oracle Data Guard.而对于我而言,我一定要亲切的叫它:DG(注:主要是因为打着方便). 不少未实际接触过dg的初学者可能会下意识以为dg是一个备份恢复的工具.我要说的是,这种形容不完全错,dg拥有备份的功能,某些情况下它甚至可以与primary数据库

一步一步学习Vue(十一)

本篇继续学习vuex,还是以实例为主:我们以一步一步学Vue(四)中讲述的例子为基础,对其改造,基于vuex重构一遍,这是原始的代码: todolist.js ; (function () { var list = []; var Todo = (function () { var id = 1; return function (title, desc) { this.title = title; this.desc = desc; this.id = id++; } })(); /** *

ios APP开发简单实例

这一次的任务是两个人合作设计一个简单的APP,其中设计到了源代码的设计,源代码的实现以及源代码的控制.在设计app前,我们先仔细研究了软件是如何设计与实现的,然后我们决定做个简单的app—提醒小闹钟.在设计的过程中,问题很多,因为从未设计过app,开始完全不知道如何去设计代码,我们两个商量了下,在百度找到了教程,跟着教程一步一步研究如何设计一个app.我们觉得做一个提醒小闹钟app,其功能是使用者设置好时间与事项后,该app就会在使用者设置的时间响起,然后显示使用者之前输入的事项. 代码我们参考

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27