我试图通过将每个区域移动到他们自己的项目中来模块化我的 ASP.NET MVC 应用程序。一切正常,直到我决定重构 AreaRegistration 的东西并使用我自己的方法(这样我也可以在我的模块中注册过滤器和依赖项)。使用反射器,我设法想出了以下内容。
首先,我为每个模块/区域实现以下接口:
public interface IModule {
string ModuleName { get; }
void Initialize(RouteCollection routes);
}
例如:
public class BlogsModule : IModule {
public string ModuleName { get { return "Blogs"; } }
public void Initialize(RouteCollection routes) {
routes.MapRoute(
"Blogs_Default",
"Blogs/{controller}/{action}/{id}",
new { area = ModuleName, controller = "Home", action = "Index",
id = UrlParameter.Optional },
new string[] { "Modules.Blogs.Controllers" }
);
}
}
然后在我的 Global.asax 文件(Application_Start 事件)中我说:
// Loop over the modules
foreach (var file in Directory.GetFiles(Server.MapPath("~/bin"), "Modules.*.dll")) {
foreach (var type in Assembly.LoadFrom(file).GetExportedTypes()) {
if (typeof(IModule).IsAssignableFrom(type)) {
var module = (IModule)Activator.CreateInstance(type);
module.Initialize(RouteTable.Routes);
}
}
}
然后我删除了现有的 AreaRegistration 东西。到目前为止,一切都运行良好。当我运行我的应用程序并将链接呈现到模块时,例如:
@Html.ActionLink("Blogs", "Index", "Home", new { area = "Blogs" }, null)
显示正确的 url,但是当我单击 url 时,它显示错误的视图。调试后,看起来 url 被路由到我的博客模块的 HomeController 中的正确操作。但是,它尝试在主项目中显示 Home/Index.cshtml 视图,而不是模块/区域中的视图。我猜想我错过了如何告诉视图引擎将路由的 url 视为一个区域,因为它似乎忽略了 AreaViewLocationFormats(在 RazorViewEngine 内部)。
如果有人能告诉我我缺少什么,我将不胜感激。谢谢