2.2. Маршрутизация в .NET Core MVC

Если сайт состоит из одной страницы, то можно все реализовать прямо в файле Startup, но если больше, то лучше делить разделять логику и представление и использовать MVC. С этим мы уже познакомились в предыдущей части, а теперь пора на практике все увидеть.

Итак, для начала нужно включить MVC, потому что по умолчанию в .NET Core приложениях ничего не включено по умолчанию и нужно это делать самостоятельно. Поэтому будет работать только то, что вы включили и ничего лишнего.

Включать подобные возможности нужно в методе ConfigureServices файла Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
}

Здесь мы подключаем MVC вызовом метода AddMvc().Тут же вызываем метод SetCompatibilityVersion, чтобы определить стандарт, которому будем соответствовать. На данный момент у меня максимальная версия 2.1, ее и выбираю.

Теперь нужно сконфигурировать MVC и маршруты.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IConfiguration config)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();
}

В принципе, для минимального приложения достаточно было бы вызвать app.UseRouting(), но для полноценной работы нужно еще настроить маршруты – как платформа будет находить код, который нужно вызывать для различных адресов URL.

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

Здесь не только запускается MVC, но и в список маршрутов добавляется значение по умолчанию:

 
   endpoints.MapControllerRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");

routes - IRouteBuilder, который отвечает за создание маршрутов. У него есть метод MapRoute, который как добавляет новый элемент в список. Есть несколько вариантов этого метода, а в качестве примера здесь используется наверно самый популярный, которому нужно указать имя и шаблон. Я не стал выдумывать здесь велосипед, а использую классический пример – в качестве имени используется просто default (по умолчанию), а в качестве шаблона {controller=Home}/{action=Index}/{id?}")

В фигурных скобках указываются части шаблона и в данном случае у нас три части, разделеных слешем:

controller=Home - указывает, что здесь первым должно идти имя класса контроллера. После знака равно стоит имя по умолчанию на тот случай, если контроллер не указан. Это значит, если пользователь пытается просто загрузить сайт www.flenov.info без указания слеша в конце и имени контроллера, то будет выполнен контроллер HomeController. Да, класс контроллера рекомендуется указывать со словом Controller в конце.

action=Index - параметр action позволяет указать, какой метод класса контроллера нужно вызвать для обработки запроса. После знака равно снова указывается имя метода по умолчанию. Если пользователь обращается к сайту www.flenov.info/blog, то маршрутизатор MVC будет искать класс BlogController и метод index в нем, потому что явно имя метода не указано:

    public class BlogController : Controller
    {        public IActionResult Index()
        {
            return View();
        }
    }

Здесь у нас самая простая реализация класс BlogController и метод Index.

Если URL будет выглядеть как www.flenov.info/blog/latest, то тут уже явно указано имя метода latest:

    public class BlogController : Controller
    {        public IActionResult Latest()
        {
            return View();
        }
    }

{id?} - последняя часть нашего шаблона – это параметр метода. Он не обязательный и об этом говорить знак вопроса. То есть последняя часть может отсутствовать вовсе и никаих значений по умолчанию не будет. Если же пользователь попытается загрузить URL с тремя частями, то первая будет контроллером, вторая будет методом контроллера, а третья будет параметром. Id в данном случае это имя параметра.

Допустим, что пользователь загружает адрес www.flenov.info/blog/show/10, маршрутизатор вызовет метод show у контроллера BlogController и передаст 10 через параметр id:

    public class BlogController : Controller
    {
        public string show(string id)
        {
            return "ID Value = " + id;
        }
    } 

Итак, на теории мы познакомились с маршрутом, теперь смотрим на практике. У нас приложение минимальное, поэтому нужно создать отдельную папку для контроллеров и папку для представлений. Щелкаем правой кнопкой по имени проекта, выбираем Add и потом Folder, чтобы создать папку, и даем ей имя Controllers. В этой папке создаем файл HomeController.cs. Кликаем правой кнопкой по папке Controllers:

В появившемся окне слева выбираем ASP.NET Core, справа выбираем MVC Controller Class и внизу выбираем имя файла, для этого примера это будет HomeController.

В качестве содержимого файла будет класс этого контроллера с одним методом Index. Как мы помним, это как раз значения по умолчанию Home – для контроллера и Index для метода и таким образом у нас получается главная страница:

Содержимое файла будет:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace MyWebSite
{
    public class HomeController : Controller
    {
        public string Index(string id)
        {
            return "ID Value = " + id;
        }
    }
}

Представлений у нас пока не будет, контроллер просто возвращает строку, а в этом случае MVC просто отобразит эту строку на странице.

Запустите сайт нажатием F5 и на страницу должна отобразиться надпись:

ID Value =

Значения нет, потому что мы ничего не передали. Когда браузер запустится, то адрес будет скорей всего https://localhost:5001. Никакого пути нет, поэтому все загрузится по умолчанию. Это то же самое, что загрузить https://localhost:5001/home/index. Попробуйте передать еще и параметр через https://localhost:5001/home/index/100 и на страницу вы должны будете увидеть число 100.

Это наверно самый популярный способ работы с маршрутизацией URL, но не единственный. Чуть позже познакомится с еще одним.

Скачать исходник

Предыдущая глава

2.1. MVC (Model View Controller) в .NET Core

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне