![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Порядок объявления маршрутов
Создадим маршрут, который будет расположен ранее и относится только к RoleController: routes.MapRoute( name: " Role", url: " roli/{action}/{id}", defaults: new { controller = " Role", action = " Index", id = UrlParameter.Optional } ); Строка “roli/{action}/{id}” однозначно задает имя контроллера в секции defaults. А action является параметром. Результат. Ссылка стала: < a href=" /roli" > Роли< /a> Уберем из defaults action=”Index”: < a href=" /roli/Index" > Роли< /a> Поместим после объявления “Defaults”: < a href=" /Role" > Роли< /a> Такая ссылка получилась, потому что вышестоящим правилом маршрута “default” можно задать путь к Role/Index: context.MapRoute( name: " default", url: " {controller}/{action}/{id}", defaults: new { controller = " Home", action = " Index", id = UrlParameter.Optional }, ); Еще надо рассмотреть один метод, который называется IgnoreRoute, он указывает маршрутизатору, что если url подходит под шаблон, то нужно вернуть ресурс, который расположен по тому адресу, а не пытаться находить контроллер. Ограничения (Constrains) Мы можем добавить в маршрутизацию ограничения запросов браузера, которые соответствуют особому маршруту. Например, id должен быть в нашем случае числовым: routes.MapRoute( name: " Role", url: " roli/{action}/{id}", defaults: new { controller = " Role", action = " Index", id = UrlParameter.Optional }, constraints: new {id = @" \d+" } ); При передаче id, которое не соответствует данному условию, будет или выбран другой маршрут, или метод не будет найден и ссылка будет битой: Для: < a href=" @Url.Action(" Index", " Role", new { id = " privet" })" > Роли< /a> Будет: < a href=" /Role/Index/privet" > Роли< /a> А для: < a href=" @Url.Action(" Index", " Role", new { id = " 1" })" > Роли< /a> Будет: < a href=" /roli/Index/1" > Роли< /a> Примечание: Более подробно об ограничениях можно узнать тут: https://stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx Areas Чтобы разделить различные по свойствам функциональные модули веб-приложения. Например, форум отдельно от всего сайта. Мы же поделим на часть Admin – где будет админка, и всё остальное, которое будет называться Default.
Сделаем следующие действия: · Переименуем _Default в Default везде. · Перенесем свои контроллеры (кроме BaseController) в папку Areas/Default/Controllers · Переименуем namespace для контроллеров в LessonProject.Areas.Default.Controllers · Исправляем DefaultAreaRegistration: Здесь важно обратить внимание на новый параметр для задания маршрутов: namespaces, он указывает, из каких namespace можно выбирать контроллеры для разбора маршрута: public class DefaultAreaRegistration: AreaRegistration { public override string AreaName { get { return " Default"; } }
public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( name: " default", url: " {controller}/{action}/{id}", defaults: new { controller = " Home", action = " Index", id = UrlParameter.Optional }, namespaces: new [] { " LessonProject.Areas.Default.Controllers" } ); } } · В Global.asax есть строка AreaRegistration.RegisterAllAreas(); которая регистрирует все найденные объявления area, но она нам не подходит, так как если DefaultArea зарегистрировать раньше AdminArea, то будет срабатывать маршрутизация Default, а в админку мы уже не сможем попасть, поэтому исправляем:
var adminArea = new AdminAreaRegistration(); var adminAreaContext = new AreaRegistrationContext(adminArea.AreaName, RouteTable.Routes); adminArea.RegisterArea(adminAreaContext);
var defaultArea = new DefaultAreaRegistration(); var defaultAreaContext = new AreaRegistrationContext(defaultArea.AreaName, RouteTable.Routes); defaultArea.RegisterArea(defaultAreaContext);
· Регистрацию маршрутов убираем (не api). Запускаем. А где итог????
|