MVC2中Area的路由注册实现
今天碰到了一个不可思议的bug,新增的controller中任何action都无法访问,都是返回404错误。一般这种错误要么是拼写错误,要么是不小心给action加了post属性,但是经过初步的排查,没有发现问题。而原有的controller中任何action都访问正常,新增的action也没有问题,但是换到新创建的那个controller中,问题就出现。于是问题定位在新增的那个controller中。于是翻开mvc的教程,仔细回顾了一下MVC中路由定位controller和action的过程,也没发现问题。最后仔细比对了一下代码,居然发现新旧controller的命名空间不一样,然后有查看了实现AreaRegistration的注册类iRecruiteAreaRegistration,只要controller的命名空间和iRecruiteAreaRegistration的命名空间一致的,都能正常寻找到action。
仔细看了一下MVC2中关于area注册路由的实现方式,确定area中的controller、action的路由跟命名空间是紧密联系在一起的。
MVC2中新增的area的路由也是在网站启动的时候注册的,即global的start方法中执行的,调用的方法是 AreaRegistration.RegisterAllAreas();这个方法遍历程序集中个继承了AreaRegistration类的类型,然后逐个调用这些类型的RegisterArea方法。一个常见的AreaRegistration类型如下。通常如果通过visual studio添加的area都自动生成了这个类。(我这里的area是手动生成的)。那么areaRegistration会关注哪些controller呢?实际上AreaRegistration类型会将其所在的命名空间保存在DataTokens["Namespaces"]中,在接收请求的时候就只会在这些命名空间或子空间中寻找controller,如果命名空间写错了,当然就无法识别了。因此实际上area注册仅仅起到的作用是,将area的名字和命名空间关联起来。因此如果要导航area中的controller必须首先提供area名字,这样就不会找到其他命名空间下的controller了。
文字描述比较多,具体可参考Apress.Pro.ASP.NET.MVC.2.Framework一书中Chapter8关于urls和routes的描述,非常的详细。
![](/assets/blank.gif)
![](/assets/blank.gif)
2 {
3 public class iRecruiteAreaRegistration : AreaRegistration
4 {
5 public override string AreaName
6 {
7 get
8 {
9 return "iRecruite";
10 }
11 }
12
13 public override void RegisterArea(AreaRegistrationContext context)
14 {
15 context.MapRoute(
16 "iRecruite_default",
17 "iRecruite/{controller}/{action}/{id}",
18 new { action = "Index", id = UrlParameter.Optional }
19 );
20 }
21 }
22 }
转载于:https://www.cnblogs.com/shenba/archive/2011/11/24/2262245.html
MVC2中Area的路由注册实现相关推荐
- VS2013和VS2015中MVC 区域路由匹配顺序相反
创建测试工程 分别在vs2013和vs2015中创建mvc项目,并创建First.Second.Three三个Area,每个Area下面创建一个HomeController和Index视图.修改Rou ...
- ASP.NET Web API WebHost宿主环境中管道、路由
ASP.NET Web API WebHost宿主环境中管道.路由 前言 上篇中说到ASP.NET Web API框架在SelfHost环境中管道.路由的一个形态,本篇就来说明一下在WebHost环境 ...
- ASP.NET Web API Selfhost宿主环境中管道、路由
ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...
- ASP.NET Web API 中的属性路由
为什么要有属性路由 基于约定路由的一个优点是模板在单个位置中定义,并且路由规则在所有控制器上一致的应用.但是基于约定的路由很难支持RESTFUl 中常见的某些URI模式.例如,资源通常包含子资源,客户 ...
- Win XP中恢复受损的注册表
使用Windows 98的时代,如果注册表受损,我们可以启动到DOS下,然后用ScanReg来扫描和恢复受损的注册表,不过在Windows XP中这个方法就失效了.不过XP也有适用于它的恢复方法,下面 ...
- mvc 路由 .html 404,部署ASP.NET的MVC网站到IIS 6.0中,发现路由无法解析而出现404错误解决方案...
部署ASP.NET MVC应用到IIS 6总是会引起混乱在第一.你已经编码在Visual Studio 2008中,看到你可爱干净的URL中内置的Web服务器很好地工作,你坚持了一些代码的Window ...
- 【夯实Spring Cloud】Spring Cloud中的Eureka服务注册与发现详解
本文属于[夯实Spring Cloud]系列文章,该系列旨在用通俗易懂的语言,带大家了解和学习Spring Cloud技术,希望能给读者带来一些干货.系列目录如下: [夯实Spring Cloud]D ...
- 路由器中的静态路由设置
静态路由设置实例解析 随着宽带接入的普及,很多家庭和小企业都组建了局域网来共享宽带接入.而且随着局域网规模的扩大,很多地方都涉及到2台或以上路由器的应用.当一个局域网内存在2台以上的路由器时,由于其下 ...
- Go语言WEB框架:路由注册
路由注册 路由注册用于建立URL路径与处理器函数(也可以叫控制器函数)的对应关系.一条路由规则由三部分组成: http请求方法 url路径 处理器函数 以下代码注册了一个处理器函数:Hello,当用户 ...
最新文章
- 利用JS中window.showModalDialog()详解
- RHCSA 解析-01
- 西藏监狱首次奏响《婚礼进行曲》
- java-静态-单例-继承
- 使用 Apache Lucene 搜索文本——轻松为应用程序构建搜索和索引功能
- TypeScript 里的枚举类型 enum
- c语言python零基础教学_编程零基础应当如何开始学习 Python?
- C语言 几种排序方法(冒泡、选择、插入、归并、快速)
- 双十一有“后悔药”了?淘宝88VIP将推出退货秒退款服务
- FFmpeg wav转pcm(十一)
- mysql与oracle存储过程_MySQL与Oracle差异比较之五存储过程Function
- 黑马程序员_java基础笔记(03)...面向对象
- SQL server 数据库调用远程数据库存储过程的实现方法
- html网页计算器代码form,HTML网页之计算器代码
- Android之ListView
- 怎么注销百度云服务器账号,百度网盘如何注销账号?百度网盘注销账号的方法步骤...
- 3GPP最新提案查询方法
- ubuntu20编译Gmssl时,“version OPENSSL_1_1_0d not defined”问题的较好解决办法
- 博客导航——一站式搜索(所有博客的汇总帖)
- 电脑网正常,除了IE之外其他浏览器都能正常上网,IE不能上网解决办法
热门文章
- python求偏度系数_用 Python 讲解偏度和峰度
- c语言函数的三种调用方式是什么?
- 图解C语言的希尔排序
- php array assoc,如何学习PHP array_intersect_assoc()
- Android接入热敏打印机,Android 关于佳博和汉印蓝牙热敏打印机开发
- python区域找图命令_python读取图片任意范围区域
- ubuntu中安装sublime text3用于python编程
- CCF CSP 201403-1 相反数(C++)
- 武警多业务光端机,五防光端机产品介绍
- 【渝粤教育】 国家开放大学2020年春季 2772家畜环境卫生与设施 参考试题