TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.74K subscribers
Post #422 828
День триста пятьдесят четвёртый. #ЗаметкиНаПолях
ASP.NET MVC 5.
Представления. Начало
Большинство методов действия контроллера должны отображать динамическую информацию в формате HTML. После того, как контроллер выполнил соответствующую логику для запрошенного URL, он делегирует отображение результата представлению.
В отличие от файловых веб-платформ сами представления непосредственно недоступны. Нельзя задать в браузере путь к представлению и сделать так, чтобы оно отобразилось. Вместо этого представление всегда отображается контроллером, который передаёт представлению данные для отображения.

В ASP.NET представления — это файлы .cshtml, в которых используется C# в разметке Razor. По соглашению представления размещаются в папке Views, сгруппированы по папкам соответственно контроллеру, к которому они относятся, и называются по имени метода действия. Например, представления, относящиеся к контроллеру HomeController, размещаются в папке Views/Home. Представления для метода действия Index() называется Index.cshtml, для метода About() – About.cshtml. Общие представления, которые используются несколькими контроллерами, а также макеты страниц размещаются в папке Views/Shared.

Представления, как правило, возвращаются из методов действия в виде объекта ViewResult. Можно создавать и возвращать объект напрямую, однако обычно используется вспомогательный метод View:
public class HomeController : Controller {
public ActionResult About() {
return View();
}
}
Соглашение об именовании помогает системе найти нужное представление в файле Views/Home/About.cshtml. Методу View можно передать строковый параметр с указанием пути к нужному представлению, а также объект модели, данные которой нужно отобразить.

ViewBag и ViewData
Помимо модели, для передачи небольших объёмов данных в представление из метода действия используется специальный словарь ViewData:
ViewData["CurrentTime"] = DateTime.Now;
С введением динамических типов в C#4 стало возможно использовать динамическую обёртку ViewBag, в котором можно задавать значения как свойства:
ViewBag.CurrentTime = DateTime.Now;
Этот код эквивалентен предыдущему, и технически ни один вариант не имеет преимущества перед другим. Однако в некоторых случаях ViewData может иметь преимущество, например, следующий код не выполнится из-за динамической природы ViewBag: @Html.TextBox("name", ViewBag.Name)
Здесь нужно либо использовать ViewData["Name"], либо приводить значение к нужному типу: (string)ViewBag.Name.

Строго типизированные представления
Если в представление нужно передать модель, то создаётся строго типизированное представление. Оно отличается от обычного указанием в заголовке файла представления типа модели через декларацию @model. Следующая декларация объявляет строго типизированное представления для списка товаров:
@model IEnumerable<Product>
Это позволяет компилятору проверять типы данных модели, в отличие от передачи данных через ViewBag/ViewData, а разработчикам использовать преимущества IntelliSense в представлении.

Модели представления
Иногда в представлении нужно отобразить дополнительную информацию, помимо данных из модели домена. Например, в представлении корзины покупок помимо списка товаров нужно отобразить общую сумму покупки и сообщение (допустим, информацию о доставке).
Есть два пути добиться этого: использовать ViewBag/ViewData, либо создать специализированный класс модели представления, содержащий как список продуктов, так и необходимые дополнительные свойства:
public class ShoppingCartViewModel {
public IEnumerable<Product> Products { get; set; }
public decimal CartTotal { get; set; }
public string Message { get; set; }
}
Как правило, лучше использовать второй вариант. Можно рассматривать модель представления как модель, существующую только для передачи информации в представление.

Источник: Jon Galloway “Professional ASP.NET MVC 5”. – John Wiley & Sons Inc., 2014. Глава 3.
More from @netdeveloperdiary
  1. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  2. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  3. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  4. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  5. Sep 22, 2026День 2792. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  6. Sep 21, 2026🔍Тестовое собеседование с Senior C# разработчиком уже завтра 22 сентября(уже завтра!) в 1…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →