// подключаем Activity — он нужен для Diagnosis-страницы (чтобы узнать ID запроса) using System.Diagnostics; // подключаем ASP.NET MVC — здесь Controller, IActionResult и другие классы using Microsoft.AspNetCore.Mvc; // подключаем наши модели — ErrorViewModel и ContactViewModel using TechnoWorld.Models; // пространство имён нашего проекта — все контроллеры лежат в папке Controllers namespace TechnoWorld.Controllers; // главный контроллер — отвечает за Most страниц: главную, о системе, контакты и ошибки public class HomeController : Controller { // логгер — через него можно писать сообщения в консоль/логи для отладки private readonly ILogger _logger; // конструктор — сюда ASP.NET сам подставит логгер (внедрение зависимостей, dependency injection) public HomeController(ILogger logger) { _logger = logger; } // метод Index — это главная страница сайта // когда кто-то заходит на localhost:5000/ — вызывается именно этот метод public IActionResult Index() { // передаём в представление, что заголовок страницы — "Главная" ViewData["Title"] = "Главная"; // возвращаем представление (страницу Views/Home/Index.cshtml) return View(); } // метод About — страница "О системе" public IActionResult About() { // ставим заголовок страницы ViewData["Title"] = "О системе"; // рендерим представление Views/Home/About.cshtml return View(); } // метод Contacts — страница "Контакты" с формой обратной связи [HttpGet] // эта страница открывается обычным GET-запросом (просто открыли ссылку) public IActionResult Contacts() { // заголовок страницы ViewData["Title"] = "Контакты"; // рендерим представление Views/Home/Contacts.cshtml return View(); } // перегрузка Contacts для POST — когда пользователь отправил форму // атрибут [HttpPost] говорит: этот метод обрабатывает POST-запросы [HttpPost] // принимаем модель формы — ContactViewModel (там имя, телефон, сообщение) public IActionResult Contacts(ContactViewModel model) { // проверяем, заполнил ли пользователь все обязательные поля if (ModelState.IsValid) { // если форма заполнена нормально — сохраняем сообщение в TempData // TempData — это временная переменная, которая живёт один редирект // потом покажем пользователю "Ваше сообщение принято" TempData["ContactSuccess"] = "Ваше сообщение принято! Мы свяжемся с вами в ближайшее время."; // перенаправляем обратно на страницу Contacts (PRG-паттерн — Post/Redirect/Get) // это нужно, чтобы при обновлении страницы форма не отправилась заново return RedirectToAction(nameof(Contacts)); } // если валидация не прошла — показываем форму снова с ошибками ViewData["Title"] = "Контакты"; return View(model); } // метод Error — страница ошибок (404, 500 и т.д.) [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] // отключаем кеширование этой страницы — чтобы браузер не запоминал ошибку public IActionResult Error(int? statusCode = null) { // создаём модель ошибки и передаём туда ID текущего запроса (чтобы можно было найти в логах) var model = new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier, // передаём код ошибки (404, 500 и т.д.) — он приходит из UseStatusCodePagesWithReExecute StatusCode = statusCode }; // передаём заголовок в зависимости от кода ошибки if (statusCode == 404) ViewData["Title"] = "Страница не найдена"; else ViewData["Title"] = "Ошибка"; // рендерим представление Views/Shared/Error.cshtml return View(model); } }