Загрузка данных
Ниже представлен весь код, адаптированный под пространство имён 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 автоматически сопоставляет отправленные строковые значения с полями объекта модели.