Внутри папки каждой области вы увидите файл *AreaName*AreaRegistration.cs
. Здесь хранятся правила маршрутизации области. По умолчанию, поскольку они генерируются, они будут содержать имя области впереди всего остального. Проблема в том, что если вы удалите имя области «папка» из маршрута, маршрут перехватит все «стандартные» {controller} / { действие} / {id} запросов. Что, очевидно, не то, что вы хотите ..
Чтобы преодолеть это, вы можете добавить фильтры регулярных выражений в маршруты на основе имен контроллеров, присутствующих в этом маршруте. Недостаток? Вы не сможете иметь два контроллера с одинаковым именем в приложении (по крайней мере, не используя стандартный маршрут. Вы всегда можете придумать другой маршрут для доступа к ним :))
В конце концов .. Имея эту структуру:
/ Areas
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs
/Controllers/PageController.cs
То, что вы должны иметь, вот что:
В BlogAreaRegistration.cs:
context.MapRoute(
"Blog_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { controller = "(Blog|Feed)" }
);
В UserAreaRegistration.cs:
context.MapRoute(
"User_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { controller = "(User)" }
);
В Global.asax.cs:
public static void RegisterRoutes(RouteCollection routes)
{
context.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
Обратите внимание, что в области global.asax регистрация на первом месте! :)
UPD:
На основании вашего вопроса обновления:
Здесь есть одна важная вещь, которую вы должны принять во внимание, если будете использовать области: если у вас есть межобластная ссылка, вам также нужно будет указать название области в ссылке. Э.Г.
<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %>
Вы поняли идею.
Что касается нескольких моделей / представлений, в данный момент я следую за структурой, подобной этой
/ Code / // помощник, классы расширений, которые не перемещены в библиотеки
/ Модели / Данные / // Классы EF + классы проверки здесь
/ Models / ViewModels / {controller} / // просмотр моделей, сохраненных для каждого контроллера
Пока все работает нормально, и мне удалось сохранить решение относительно организованным. Как я уже говорил, единственная область, которую я создал до сих пор, - это область Admin
, поскольку она сильно отличается от остальной части веб-сайта :)