【转自:http://www.cnblogs.com/dozer/archive/2010/04/14/change-order-of-MVC-Areas.html】

一、前言

首先,有人要问,为什么要更改Areas的注册顺序呢?

使用Areas的时候一般会在前面加标识符,比如:admin/{controller}/{action}/{id}

而且Areas的注册早于默认的网站 (就是不放在Areas文件夹中的那个网站)

但是,我想,能不能干脆就不用外部的那个默认网站,而是把所有部分都放Areas中呢?

然后,把其中一个的标识符去掉,变成默认的网站

这时候,项目根目录就少了2个文件夹,Controller和View

是不是很整洁?的确…但问题也随之而来

二、把所有网站都放在Areas里的一个大问题

简单的来说,这个问题就是你无法指定不同Area的注册顺序,那会出现什么问题呢?

如果我有2个Area:

一个是带标识符的,叫admin,地址是 admin/{controller}/{action}/{id}

一个是默认的,叫web,地址是 {controller}/{action}/{id}

这时候,如果web注册比admin早,就会出现问题了,就算我输入 admin.aspx,按照次序,会先被web捕捉,被认为是web中的一个controller

所以我们需要想办法更改areas的注册顺序

至于为什么默认的时候不能确定顺序?看一下MVC源代码就知道了,它是利用反射来获得Areas的,放到一个集合后用foreach注册

三、设定注册顺序的2种方法

1)第一种方法是昨天看到以为博友写了篇关于Areas的文章,我在下面问他后他告诉我的

传送门,看下面留言即可知道了:www.cnblogs.com/terrysun/archive/2010/04/13/1711218.html

他的方法是把Areas的注册移出来,放在同一个地方,这样就可以随意地更改顺序了

2)第二种方法是我昨天刚试验成功的,虽然看似麻烦,但是看起来更清楚一点,我个人推荐

首先,我重写了一个 AreaRegistration 类,这个类是用来注册Areas的


AreaRegistrationOrder

 /// <summary>
/// 根据顺序注册Areas
/// </summary>
abstract public class AreaRegistrationOrder : AreaRegistration
{
/// <summary>
/// 存放AreaContent
/// </summary>
protected static List<AreaRegistrationContext> areaContent = new List<AreaRegistrationContext>(); /// <summary>
/// 存放AreaRegistration
/// </summary>
protected static List<AreaRegistrationOrder> areaRegistration = new List<AreaRegistrationOrder>(); /// <summary>
/// 劫持
/// </summary>
/// <param name="context"></param>
public override void RegisterArea(AreaRegistrationContext context)
{
areaContent.Add(context);
areaRegistration.Add(this);
} /// <summary>
/// 注册
/// </summary>
/// <param name="context"></param>
public abstract void RegisterAreaOrder(AreaRegistrationContext context); /// <summary>
/// 顺序
/// </summary>
public abstract int Order { get; } /// <summary>
/// 按照顺序注册Areas
/// </summary>
public static void RegisterAllAreasOrder()
{
RegisterAllAreas();
Register();
} /// <summary>
/// 注册
/// </summary>
private static void Register()
{
List<int[]> order = new List<int[]>();
for(int k=0;k<areaRegistration.Count;k++)
{
order.Add(new int[] { areaRegistration[k].Order, k });
}
order = order.OrderBy(o => o[0]).ToList();
foreach (var o in order)
{
areaRegistration[o[1]].RegisterAreaOrder(areaContent[o[1]]);
}
}
}
}

那接下来怎么使用这个抽象类呢?

你只需要改2个地方

1)首先,你需要把Global.asax中原来那个注册全部Areas的函数换掉,并且把RegisterRoutes函数中的代码删掉

(上图注释中有一个错别字,应该是”代码也删除“,不是”代码页删除“)

2)接下来,你就可以新建一个Areas了,对于新建的Areas,你需要做如下修改:

总结一下你总共要做那些事:

.   把原来继承的类换掉,换乘上面那个类,并实现抽象函数

..  把RegisterArea删掉,换成RegisterAreaOrder,原来的操作写在RegisterAreaOrder中

... Order中,指定它的顺序,越小越就早执行,可以是负数

四、Ending

源代码下载:http://files.cnblogs.com/dozer/MVC-AREAS.zip

更改MVC注册Areas的顺序,掌控Areas的运作的更多相关文章

  1. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  2. IT运维大会精华回顾 等保2.0时代掌控万物互联

    10月24日,由<网络安全和信息化>杂志社.IT运维网联合主办的“2019(第十届)IT运维大会”在北京新世纪日航酒店成功举行. 随着大数据.云计算.物联网.互联网+等快速发展,IT系统架 ...

  3. 【干货分享】JPager.Net MVC超好用轻量级分页控件

    JPager.Net  MVC好用的轻量级分页控件,好用到你无法想象,轻量到你无法想象. JPager.Net  MVC好用的轻量级分页控件,实现非常简单,使用也非常简单. JPager.Net  M ...

  4. ACM对时间掌控力和日积月累的习惯的意义

    马云说,要想创业成功,不是要知道现在什么东西最火,而是要清楚的知道十年以后什么东西最火.这就意味着,你对时间掌控力,至少要有十年. 但是仔细回想一下自己的学生时代,自己对时间的把握是怎样的?有些人只能 ...

  5. IQ一个人的智力和对科学知识的理解掌握程度。 EQ对环境和个人情绪的掌控和对团队关系的运作能力。 AQ挫折商 一个人面对困境时减除自己的压力、渡过难关的能力。

    IQ: Intelligence Quotient 智商 一个人的智力和对科学知识的理解掌握程度. EQ: Emotional Quotient 情商 一个人对环境和个人情绪的掌控和对团队关系的运作能 ...

  6. ASP.NET MVC中加载WebForms用户控件(.ascx)

    原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControl ...

  7. ASP.NET MVC显示WebForm网页或UserControl控件

    ASP.NET MVC显示WebForm网页或UserControl控件 学习与使用ASP.NET MVC这样久,还是对asp.net念念不忘.能否在asp.net mvc去显示aspx或是user ...

  8. 4星|《行为设计学:掌控关键决策》:影响决策质量的四大思维陷阱及WRAP应对法

    行为设计学:掌控关键决策 两位作者认为,有四大思维陷阱让人做出错误的决策:思维狭隘.证实倾向.短期情绪.过度自信.两位作者提出WRAP决策流程来应对:Widen your options(拓宽选择空间 ...

  9. CIO需加强对战略管理层面的掌控-精华篇

    当代CIO面临提升信息化作用的新机遇.CIO在企业中,不能满足于职能性的技术支撑角色,要找到新的着力点,以发挥信息化在全局战略中的作用,把信息化力量聚焦于做强做优,提高国际竞争力上来,成为企业不可或缺 ...

随机推荐

  1. Win7如何开机直接进桌面

    运行CONTROL USERPASSWORDS2 取消登陆要密码那项后再点应用,直接输入密码下次就能自己登陆进入桌面啦

  2. Android 如何在关于手机界面添加个图片

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  3. UVA 10168 Summation of Four Primes(数论)

    Summation of Four Primes Input: standard input Output: standard output Time Limit: 4 seconds Euler p ...

  4. 在linux下的使用复制命令cp,不让出现“overwrite”(文件覆盖)提示的方法。(转)

    在linux下的使用复制命令cp,不让出现“overwrite”(文件覆盖)提示的方法. 一般我们在使用cp命令时加上-f选项,希望不让出现“overwrite”的提示(文件覆盖的提示).如:# cp ...

  5. Linxu 监控命令总结

    free –m [root@web1476 ~]# free        total       used       free     shared    buffers     cached M ...

  6. WPF自定义控件之水印文本(密码)框

    首先来讲讲创建这个控件的初衷,一个让我很郁闷的问题. 公司的客户端项目采用WPF+MVVM技术实现,在近期地推客户端的过程中遇到了一个很奇葩的问题:在登录界面点击密码框就会直接闪退,没有任何提示 密码 ...

  7. 机器学习之数据预处理,Pandas读取excel数据

    Python读写excel的工具库很多,比如最耳熟能详的xlrd.xlwt,xlutils,openpyxl等.其中xlrd和xlwt库通常配合使用,一个用于读,一个用于写excel.xlutils结 ...

  8. FreeMarker静态化文件解决SEO推广问题

    1.问题背景 SEO一直是站点对外推广的一个重要手段,如何可以让搜索引擎高速搜索到站点对于增强站点的浏量,提升站点对外形象有着重要意义.那么如何可以对SEO进行优化呢?一个很经常使用的手段就是在网页的 ...

  9. 《MVC +EasyUI 》——表单的提交

        之前用AJax给Controller传递參数,然后再调用服务端的方法对数据库进行更改,今天碰到一个新的方法,就是表单的提交.这样能够省去AJax穿參.当表单提交后.我们能够获取表单上控件中的值 ...

  10. atitit.http get post的原理以及框架实现java php

    atitit.http get post的原理以及框架实现java php 1. 相关的设置 1 1.1. urlencode 1 1.2. 输出流的编码 1 1.3. 图片,文件的post 1 2. ...