Области ASP.NET MVC в отдельных проектах - Refactor AreaRegistration Stuff - PullRequest
0 голосов
/ 10 ноября 2011

Я пытаюсь структурировать свое приложение 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).

Я был бы признателенесли бы кто-то мог показать мне, чего мне не хватает.Спасибо

1 Ответ

0 голосов
/ 14 ноября 2011

После дальнейшего рефакторинга создается впечатление, что механизм просмотра ищет маркер данных области.Поэтому я изменил код для добавления маршрутов в метод 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);

Надеюсь, это поможет.

...