День триста пятьдесят четвёртый. #ЗаметкиНаПолях
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.
>>Click here to continue<<