按照MvcContrib方式搭建了主/子项目,访问子项目url出现"无法找到资源"
MvcContrib方式请参考:
http://www.cnblogs.com/dingji/archive/2012/06/10/2544255.html
于是断点在:
public class MyDemoAreaRegistration : PortableAreaRegistration{
public override string AreaName
{
get
{
return "MyDemo";
}
}
public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
{
//断点处,此处方法是继承PortableAreaRegistration类的
//...........
}
}
运行发现代码并没有停在继承的方法处,说明继承的东西有问题,
既然是继承的东西有问题,那么我们来找一找被继承的PortableAreaRegistration类所定义的方法为什么没有被触发,
鼠标移上去,可见此类完全限定名为:MvcContrib.PortableAreas.PortableAreaRegistration,
既然子项目引用了MvcContrib.dll,那么是不是主项目引用的MvcContrib.dll不一致呢?
展开主项目发现压根没有引用MvcContrib.dll,那么问题究竟出在哪里呢?
来到PortableAreaRegistration定义处,发现其继承了AreaRegistration类,
鼠标放到AreaRegistration上,可见完全限定名为:System.Web.Mvc.AreaRegistration,
也就是说AreaRegistration类来自System.Web.Mvc.dll,此时恍然大悟,
查看主项目和子项目的System.Web.Mvc.dll,发现版本不一致,因此导致了主/子项目使用的dll不一致,
所以,子项目继承的类也不是同一个类,那么被继承的方法当然也就不会被触发咯
总结调用层次结构:
Global.asax.MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
System.Web.Mvc.AreaRegistration.RegisterAllAreas();//此处System.Web.Mvc.AreaRegistration被public abstract class PortableAreaRegistration继承
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
public abstract class MvcContrib.PortableAreas.PortableAreaRegistration : System.Web.Mvc.AreaRegistration
{
public override void RegisterArea(AreaRegistrationContext context);//重写父类的方法
}
public class MyDemoAreaRegistration : MvcContrib.PortableAreas.PortableAreaRegistration
{
public override string AreaName
{
get
{
return "MyDemo";
}
}
public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
{
//再次重写父类方法
}
}
解决办法:更换子项目的System.Web.Mvc.dll使其和主项目System.Web.Mvc.dll的版本一致即可。
原因分析:
引起此现象其主要原因是因为子项目和主项目创建的时候使用的并不是同一个vs版本创建,vs2015抛弃了asp.net mvc4,因此在创建项目的时候只能选择net framework 4.5及以上,故此创建的是MVC5,才会出现引用System.Web.Mvc.dll版本不一致