LUKIYA'S NEVERLAND

春去秋来,花谢花开。


这几天在用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注册,达到按顺序注册的目的。