99 lines
5.4 KiB
C#
99 lines
5.4 KiB
C#
// подключаем 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<HomeController> _logger;
|
||
|
||
// конструктор — сюда ASP.NET сам подставит логгер (внедрение зависимостей, dependency injection)
|
||
public HomeController(ILogger<HomeController> 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);
|
||
}
|
||
}
|