Главная страница   /   23.3. Усовершенствование движка представления Razor (ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

Джеффри Палермо

23.3. Усовершенствование движка представления Razor

В то время как DisplayModes и пакетирование – это брендовые новые первоклассные возможности, ASP.NET MVC 4 также усовершенствовал движок представления Razor, добавив некоторый полезный "синтаксический сахар". При переходе на MVC 4 проект вы можете воспользоваться преимуществами автоматической "тильда-слэш" резолюции и условных атрибутов. Несмотря на то, что эти изменения могут показаться слегка индивидуальными, они значительно уменьшают загромождение ваших представленийв то время, когда вы начинаете их использовать.

Тильда-слэш: ~/

Начиная с первой версии ASP.NET, в ней присутствует особая управляющая последовательность, которая обозначает абсолютный корневой URL веб-приложения. Она была представлена двумя символами: тильда и слэш – ~/. Когда URL ресурса в вашем приложении начинается с этих символов, фреймворк принимает эти символы за корневой URL вашего приложения (который может быть виртуальным каталогом).

Хорошей практикой является размещение ваших ресурсов посредством этого синтаксиса с тем, чтобы вы могли изменять способ, согласно которому выполняется развертывание вашего приложения без необходимости изменения любого вашего исходного кода или представлений. Этими ресурсами могут быть URL изображений, CSS, JavaScript или URL страниц или действий в рамках вашего приложения.

Автоматическая "тильда-слэш" резолюция

В Razor 1.0 (версия движка представления Razor, которая поставлялась вместе с MVC 3) единственным способом разрешения относительных URL, обозначаемых с помощью последовательности "тильда-слэш", было использование вспомогательного метода, который вызывался в основном коде ASP.NET.

Ниже приведен пример синтаксиса, который использует метод Content UrlHelper.

<img src="@Url.Content("~/Images/twitter.png")"/>

Более новый синтаксис, который будет генерироватьту же самую HTML-разметку, намного проще и уменьшает помехи в представлениях:

<img src="~/Images/twitter.png"/>

Сам Razor в настоящий момент будет вызывать основной код ASP.NET для того, чтобы разрешить относительные URL – метод Content устарел. Данный пример демонстрирует новый синтаксис, в котором "тильда-слэш" резолюция помещается прямо в атрибут src HTML элемента img. Razor понимает, что строка является URL и автоматически вставляет и разрешает ~/ к корневому URL веб-приложения. URL, который отображается посредством использования двух этих синтаксисов, один и тот же. Предыдущие примеры оба разрешают следующую HTML-разметку:

<img src="/Images/twitter.png"/>

Условные атрибуты

Условные атрибуты – это атрибуты HTML элементов, которые пропускаются в родительском элементе, когда значение атрибута равно null. Каноническим примером этого является принятие решения о том, отображать ли атрибут class тега div на основании того, существует ли значение класса. По традиции, это приводит к некоторому приятному грубому коду.

Чтобы лучше все это понять, ниже приведен конкретный пример этого сценария. Ниже показано, как записываются условные атрибуты в Razor 1.0:

@{
	string bodyClass = null;
	if (ViewBag.RightToLeft)
	{
		bodyClass = "RTL";
	}
}
<body @{if (bodyClass != null) { <text>class="@bodyClass"</text> } }>

В данном примере если свойство RightToLeft ViewBag имеет значение true, то класс с названием RTL должен быть добавлен в атрибут class элемента body. Блок кода C# данного примера довольно простой. Блок Razor шаблона, который немного сложнее для чтения, – это разметка для body's class (строка 7). До версии 4 данный код является общепринятым в ASP.NET MVC представлениях, и его трудно читать и поддерживать в работоспособном состоянии из-за оператора if и тегов text.

В отличие от предыдущего примера следующий код демонстрирует способ, с помощью которого условные атрибуты записываются с помощью новой встроенной поддержки условных атрибутов в Razor 2.0.

@{
	string bodyClass = null;
	if (ViewBag.RightToLeft)
	{
		bodyClass = "RTL";
	}
}
<body class="@bodyClass">

Если значение bodyClass равно null или пустой строке, то Razor пропускает внутренний атрибут класса. Razor достаточно умен для того, чтобы управлять всей этой работой за нас.

Эти новые возможности являются большой победой для UI-разработчиков. Более простой, условный синтаксис делает универсальные задачи кодирования более легкими для написания, чтения и поддержки в работоспособном состоянии.