实现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注册,达到按顺序注册的目的。