Учитывая природу вопросов, которые вы задавали, я хочу порекомендовать ресурс, который, я думаю, вы ДЕЙСТВИТЕЛЬНО полюбите.Книга Стивена Сандерсона "Pro ASP.NET MVC 2 Framework (второе издание)" по адресу.Глава 8, в частности, содержит много подробностей о маршрутизации и областях.Сама книга отличная и продуманная;один из лучших примеров книг по разработке / программированию, которые я когда-либо читал.Он доступен в форме Kindle, и если вы заказываете у apress напрямую, вы можете получить его в виде электронной книги в формате PDF.Конечно, он также доступен в бумажной форме:
Amazon Link
или
Напрямую от Apress
Конкретная вещь, которую вы, возможно, захотите понять об областях, состоит в том, что они основаны на пространствах имен.Когда вы создаете область, пространство имен этой области - это то, как MVC определяет их местонахождение и решает, что находится внутри и в области, а что нет.Обычно это означает, что маршрутизация к областям осуществляется через URL-адреса, в которых имя области является первой папкой в URL-адресе, но это сопоставляется с пространством имен контроллера, а не обязательно с именами физических папок (хотя они должны совпадать, если вы хотите сохранить вашивменяемость).
Маршрут в примере с Манафом работает «случайно» больше, чем намеренно, поэтому, вероятно, вы не совсем понимаете, что он делает.Существует странность с неоднозначными именами контроллеров в «корневой области» (то есть в папке контроллера, которой нет в области).Поскольку маршрут ведет к корневой области, но он не может найти там контроллер, он будет сканировать все области в поисках совпадения.В этом случае он находит совпадение в вашем пространстве имен новостей и работает.Но это сканирование работает, только если совпадает только один контроллер.Таким образом, если вы создадите другой контроллер в другой области с тем же именем, он потерпит неудачу с исключением типа «найдено несколько типов».
У вас есть два хороших способа сделать эту работу более надежной.Либо, установив приоритет области новостей в маршрутах, либо перенаправив:
Перенаправление:
Вместо того, чтобы направлять корневые запросы к контроллеру в определенной области, вы можете перенаправить Браузер на URL-адресобласть, с которой вы хотите, чтобы они начали.Поэтому они начинаются с "yoursite.com/" и будут перенаправлены на URL "yoursite.com/news/articles".Для этого вы создаете контроллер корневого уровня и используете маршрут по умолчанию.Итак, создайте HomeController в корневой папке контроллеров (а не в области).На этом контроллере создайте метод действия с именем Index.И в этом методе Index перенаправьте их на контроллер, на котором вы действительно хотите, чтобы они запускались.
В global.asax вы можете положиться на довольно стандартный маршрут по умолчанию, подобный следующему:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameters.Optional }
);
В вашем действии Index на контроллере Home просто перенаправьте клиент на нужный контроллер вобласть новостей с использованием RedirectToAction и указанием области:
return RedirectToAction("IndexOfArticles", "Articles", new { area = "News" });
Второй метод заключается в определении приоритетов маршрута, чтобы он знал, какую область использовать.Это не требует никаких контроллеров корневого уровня.Просто добавьте запись маршрута, которая выглядит примерно так:
routes.MapRoute(
"Default",
"{controller}/{acion}/{id}",
new {controller = "Articles", action = "IndexOfArticles", id = UrlParameters.Optional},
new[] {"YourApplication.News"}
);
Недостатком этого является то, что 4-й параметр (пространства имен) будет применяться ко всем запросам, поэтому он может привести к перенаправлению большего количества данныхваша конкретная новость, чем вы хотели.Может быть, лучше быть более точным во втором параметре, чтобы этот маршрут не перехватывал другие запросы ... возможно, установите второй параметр в пустую строку, чтобы он только перехватывал корневой запрос сайта.