Добавление MVC в пустой проект

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 16.11.2019

В прошлой теме был создан первый проект ASP.NET Core MVC, но осталось за кадром, что именно заставляет паттерн MVC работать в проекте на ASP.NET Core? В чем ключевое отличие проекта по типу Empty, который функциональность MVC не содержит, от проекта по типу Web Application? Рассмотрим этот момент.

И в начале создадим новый проект ASP.NET Core по типу Empty - то есть тот, который mvc по умолчанию не использует:

Теперь задействуем функциональность фреймворка MVC в нашем приложении. MVC подключается в приложение в качестве сервиса. Поэтому откроем класс Startup и изменим его следующим образом:

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

namespace EmptyApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();	// добавляем сервисы MVC
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseRouting(); // используем систему маршрутизации

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

Во-первых, в методе ConfigureServices() с помощью вызова services.AddMvc() добавляются всее сервисы MVC. После этого мы можем использовать фреймворк.

Во-вторых, в методе Configure() через вызовы app.UseRouting() и app.UseEndpoints() встраивается система маршрутизации, которая позволяет связать приходящие от пользователей запросы с контроллерами. В общих чертах система маршрутизации уже рассматривалась в одной из предыдущих тем (Основы маршрутизации в ASP.NET Core). В данном же случае стоит отметить, что мы используем метод MapControllerRoute() интерфейса IEndpointRouteBuilder для связи контроллеров с маршрутом "{controller=Home}/{action=Index}/{id?}", то есть трехсегментным запросом, где первый сегмент представляет контроллер, второй сегмент - метод контроллера, а третий - необязательный параметр. При этом если в запросе не указаны сегменты (например, обращение идет к корню веб-приложения), то в качестве контроллера применяется HomeController, а в качестве его метода - метод Index.

Теперь добавим в проект для хранения контроллеров папку Controllers. И затем в нее добавим новый класс, который назовем HomeController и который будет иметь следующий код:

using Microsoft.AspNetCore.Mvc;

namespace EmptyApp.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}

Контроллер должен быть унаследован от класса Controller и в данном случае он имеет один метод Index, который с помощью метода View обращается к представлению.

Теперь добавим в проект папку Views, которая будет хранить представления. В эту папку вначале добавим каталог Home - каталог, предназначенный непосредственно для представлений контроллера Home. И в конце добавим в каталог Views/Home новый элемент по типу Razor View, который назовем Index.cshtml.

Mvc Razor View

Определим в этом файле следующий код:

@{
    Layout = null;
}
<!doctype html>
<html>
<head>
    <title>Hello ASP.NET MVC Core</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width">
</head>
<body>
    <h2>Привет мир!</h2>
</body>
</html>

Это простейшее представление, которое будет использоваться методом Index контроллера HomeController. То есть в итоге у нас получится следующая структра проекта:

Теперь запустим приложение на выполнение, и браузер выведет сообщение, определенное в представлении:

Таким образом мы можем добавлять функциональность MVC в свой проект. Однако, как правило, для работы с MVC используется шаблон ASP.NET Core Web App (Model-View-Controller), который по умолчанию содержит некоторую базовую функциональность.

Сервисы MVC

Функциональность MVC и ее работа в приложении зависит от добавляемых сервисов. В примере выше мы использовали метод AddMvc() для добавления сервисов MVC, благодаря чему система маршрутизации смогла связать запрос с контроллером. Однако в данном случае у нас есть ряд опций по встраиванию сервисов, которые мы можем при необходимости использовать:

  • AddMvc(): добавляет все сервисы фреймворка MVC (в том числе сервисы для работы с аутентификацией и авторизацией, валидацией и т.д.)

  • AddMvcCore(): добавляет только основные сервисы фреймворка MVC, а всю допалнительную функциональность, типа аутентификацией и авторизацией, валидацией и т.д., необходимо добавлять самостоятельно

  • AddControllersWithViews(): добавляет только те сервисы фреймворка MVC, которые позволяют использовать контроллеры и представления и связанную функциональность. При создании проекта по типу ASP.NET Core Web App (Model-View-Controller) используется именно этот метод

  • AddControllers(): позволяет использовать контроллеры, но без представлений.

И в зависимости от того, насколько широко нам надо использовать возможности фреймворка MVC, выбирается соответствующий метод. Например, в примере выше мы могли бы использовать вместо вызова services.AddMvc() метод services.AddControllersWithViews().

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850