0

我试图通过将每个区域移动到他们自己的项目中来模块化我的 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 内部)。

如果有人能告诉我我缺少什么,我将不胜感激。谢谢

4

1 回答 1

0

在进一步重构之后,视图引擎似乎在寻找一个区域数据令牌。因此,我将代码更改为在模块的 Initialize 方法中添加路由:

// Create the route
var route = new Route("Blogs/{controller}/{action}/{id}", new RouteValueDictionary(new { area = ModuleName, controller = "Home", action = "Index", id = UrlParameter.Optional }), new MvcRouteHandler());

// Add the data tokens
route.DataTokens = new RouteValueDictionary();
route.DataTokens["area"] = this.ModuleName;
route.DataTokens["UseNamespaceFallback"] = false;
route.DataTokens["Namespaces"] = new string[] { "Modules.Blogs.Controllers" };

// Add the route
routes.Add(route);

希望这可以帮助。

于 2011-11-14T13:02:11.107 回答