Загрузка данных


Ниже представлен весь код, адаптированный под пространство имён WebApplication17 (без комментариев внутри кода), а после каждого файла приведено подробное объяснение его работы.
1. Models/Film.cs
namespace WebApplication17.Models
{
    public class Film
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Genre { get; set; }
        public int Year { get; set; }
        public decimal Rating { get; set; }
    }
}

Пояснение:
 * Это класс модели (Model), который описывает сущность фильма в приложении.
 * Каждое свойство (Id, Title, Genre, Year, Rating) отвечает за отдельное поле данных фильма.
 * Тип decimal для рейтинга удобен, так как позволяет хранить дробные числа (например, 8.6) без погрешностей округления.
2. Controllers/MoviesController.cs
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using WebApplication17.Models;

namespace WebApplication17.Controllers
{
    public class MoviesController : Controller
    {
        private static List<Film> films = new List<Film>
        {
            new Film { Id = 1, Title = "Интерстеллар", Genre = "Фантастика", Year = 2014, Rating = 8.6m },
            new Film { Id = 2, Title = "Темный рыцарь", Genre = "Боевик", Year = 2008, Rating = 9.0m },
            new Film { Id = 3, Title = "Криминальное чтиво", Genre = "Криминал", Year = 1994, Rating = 8.9m },
            new Film { Id = 4, Title = "Гладиатор", Genre = "Драма", Year = 2000, Rating = 8.5m },
            new Film { Id = 5, Title = "Престиж", Genre = "Триллер", Year = 2006, Rating = 8.5m }
        };

        public ActionResult Index()
        {
            return View(films);
        }

        public ActionResult Details(int id)
        {
            var film = films.FirstOrDefault(f => f.Id == id);
            if (film == null)
            {
                return HttpNotFound();
            }

            return View(film);
        }

        [HttpGet]
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(Film film)
        {
            film.Id = films.Any() ? films.Max(f => f.Id) + 1 : 1;
            films.Add(film);
            return RedirectToAction("Index");
        }
    }
}

Пояснение:
 * private static List<Film> films: статическая коллекция. Модификатор static гарантирует, что список не будет пересоздаваться при каждом новом HTTP-запросе и сохранит добавленные фильмы в рамках текущего запуска приложения.
 * Index(): обрабатывает запрос к списку фильмов (/Movies) и передаёт коллекцию films в представление Index.cshtml.
 * Details(int id): принимает id из URL (например, /Movies/Details/2). С помощью LINQ-метода FirstOrDefault ищет нужный фильм. Если фильм не найден, возвращает стандартную страницу ошибки 404 (HttpNotFound()), предотвращая сбой программы.
 * [HttpGet] Create(): отдает пустую форму для создания фильма при обычном переходе по ссылке или URL /Movies/Create.
 * [HttpPost] Create(Film film): срабатывает при отправке формы. Механизм Model Binding автоматически считывает поля формы и собирает готовый объект Film. Метод вычисляет следующий свободной Id (Max + 1), добавляет фильм в коллекцию и выполняет перенаправление RedirectToAction("Index") (паттерн Post/Redirect/Get), чтобы избежать повторной отправки данных при перезагрузке страницы.
3. Views/Movies/Index.cshtml
@model List<WebApplication17.Models.Film>

@{
    ViewBag.Title = "Каталог фильмов";
}

<h2>Список фильмов</h2>

<p>
    @Html.ActionLink("Добавить фильм", "Create")
</p>

<table class="table">
    <thead>
        <tr>
            <th>Название</th>
            <th>Жанр</th>
            <th>Год</th>
            <th>Рейтинг</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var film in Model)
        {
            <tr>
                <td>@film.Title</td>
                <td>@film.Genre</td>
                <td>@film.Year</td>
                <td>@film.Rating</td>
                <td>
                    @Html.ActionLink("Подробнее", "Details", new { id = film.Id })
                </td>
            </tr>
        }
    </tbody>
</table>

Пояснение:
 * @model List<WebApplication17.Models.Film>: строго типизирует представление, сообщая Razor, что во View передается именно список фильмов.
 * @Html.ActionLink("Добавить фильм", "Create"): генерирует HTML-ссылку <a href="/Movies/Create">Добавить фильм</a>.
 * @foreach (var film in Model): цикл Razor, который проходит по каждому элементу коллекции и отрисовывает строку таблицы <tr>.
 * @Html.ActionLink("Подробнее", "Details", new { id = film.Id }): формирует ссылку на страницу детального просмотра конкретного фильма, передавая его идентификатор в параметр маршрута (например, /Movies/Details/1).
4. Views/Movies/Details.cshtml
@model WebApplication17.Models.Film

@{
    ViewBag.Title = Model.Title;
}

<h2>Подробная информация о фильме</h2>

<div>
    <dl class="dl-horizontal">
        <dt>ID</dt>
        <dd>@Model.Id</dd>

        <dt>Название</dt>
        <dd>@Model.Title</dd>

        <dt>Жанр</dt>
        <dd>@Model.Genre</dd>

        <dt>Год выпуска</dt>
        <dd>@Model.Year</dd>

        <dt>Рейтинг</dt>
        <dd>@Model.Rating</dd>
    </dl>
</div>

<p>
    @Html.ActionLink("Назад к списку", "Index")
</p>

Пояснение:
 * @model WebApplication17.Models.Film: здесь представление ожидает не список, а ровно один объект фильма.
 * Использован тег описания <dl> (description list) с разметкой Bootstrap (dl-horizontal), который выводит данные фильма парами «термин — значение».
 * Внизу размещена кнопка-ссылка для возврата обратно к общему списку (Index).
5. Views/Movies/Create.cshtml
@{
    ViewBag.Title = "Добавить фильм";
}

<h2>Добавление нового фильма</h2>

<form method="post">
    <div class="form-group">
        <label for="Title">Название</label>
        <input type="text" id="Title" name="Title" class="form-control" required />
    </div>

    <div class="form-group">
        <label for="Genre">Жанр</label>
        <input type="text" id="Genre" name="Genre" class="form-control" required />
    </div>

    <div class="form-group">
        <label for="Year">Год выпуска</label>
        <input type="number" id="Year" name="Year" class="form-control" required />
    </div>

    <div class="form-group">
        <label for="Rating">Рейтинг</label>
        <input type="text" id="Rating" name="Rating" class="form-control" required />
    </div>

    <br />
    <button type="submit" class="btn btn-primary">Сохранить</button>
    @Html.ActionLink("Отмена", "Index", null, new { @class = "btn btn-default" })
</form>

Пояснение:
 * <form method="post">: отправляет данные методом POST на текущий адрес (/Movies/Create), где их перехватывает метод [HttpPost] Create(Film film).
 * Атрибут name у тегов <input>: самое важное место — значения атрибутов (name="Title", name="Genre", name="Year", name="Rating") в точности повторяют имена свойств класса Film. Именно благодаря этому ASP.NET автоматически сопоставляет отправленные строковые значения с полями объекта модели.