实现Asp.NET MVC2 的Area自定义注册顺序。
这几天在用MVC2做项目,发现有多个Area的时候系统默认的AreaRegistration.RegisterAllAreas();使用的是随机注册顺序,这样会造成url冲突。
找了很多解决方案,发现可以通过继承AreaRegistration类来实现自定义注册顺序,代码如下:
public abstract class OrderedAreaRegistration : AreaRegistration { // ****************************************************************************************************** #region - Fields - protected static List<AreaRegistrationContext> _AreaContent = new List<AreaRegistrationContext>(); protected static List<OrderedAreaRegistration> _AreaRegistration = new List<OrderedAreaRegistration>(); #endregion // ****************************************************************************************************** #region - Properties - public abstract int Order { get; } #endregion // ****************************************************************************************************** #region - RegisterOrderedArea - public abstract void RegisterOrderedArea(AreaRegistrationContext context); #endregion // ****************************************************************************************************** #region - RegisterAllOrderedAreas - public static void RegisterAllOrderedAreas() { RegisterAllAreas(); Register(); } #endregion // ****************************************************************************************************** #region - Register - 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]].RegisterOrderedArea(_AreaContent[o[1]]); } } #endregion // ****************************************************************************************************** #region - Overrides - public override void RegisterArea(AreaRegistrationContext context) { _AreaContent.Add(context); _AreaRegistration.Add(this); } #endregion }
使用的时候Area需要继承此类,然后实现它的Order属性,最后通过这个类的RegisterAllOrderedAreas方法进行Area注册,达到按顺序注册的目的。