Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Порядок объявления маршрутов






Создадим маршрут, который будет расположен ранее и относится только к 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).

Запускаем.

А где итог????


 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.