Движок представлений Razor

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 19.11.2019

Представление в ASP.NET MVC может содержать не только стандартный код html, но и также вставки кода на языке C#. Для обработки кода, содержащего как элементы html, так и конструкции C#, используется движок представлений.

В действительности при вызове метода View контроллер не производит рендеринг представления и не генерирует разметку html. Контроллер только готовит данные и выбирает, какое представление надо возвратить в качестве объекта ViewResult. Затем уже объект ViewResult обращается к движку представления для рендеринга представления в выходной ответ.

По умолчанию в ASP.NET MVC Core используется один движок представлений - Razor. Хотя при желании мы можем также использовать какие-то другие сторонние движки или создать свой движок представлений самостоятельно.

Цель движка представлений Razor - определить переход от разметки html к коду C#.

Синтаксис Razor довольно прост - все его конструкции предваряются символом @, после которого происходит переход к коду C#.

Все конструкции Razor можно условно разделить на два вида: однострочные выражения и блоки кода.

Пример применения однострочных выражений:

<p>Дата: @DateTime.Now.ToLongDateString()</p>

В данном случае используется объект DateTime и его метод ToLongDateString()

Или еще один пример:

<p>@(20 + 30)</p>

Так как перед скобками стоит знак @, то выражение в скобках будет интерпретироваться как выражение на языке C#. Поэтому браузер выведет число 50, а не "20 + 30".

Но если вдруг мы создаем код html, в котором присутствует символ @ не как часть синтаксиса Razor, а сам по себе, то, чтобы его отобразить, нам надо его дублировать:

<p>@@DateTime.Now =@DateTime.Now.ToLongDateString()</p>
Синтаксис движка представлений Razor

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

@{
    string head = "Привет мир!!!";
    head = head + " Добро пожаловать на сайт!";
}
<h3>@head</h3>

В блоках кода мы можем определить обычные переменные и потом их использовать в представлении.

Весь код в пределах блока расценивается как код c#. Однако с помощью конструкции @: мы можем в блоке кода выводить на веб-страницу текст:

@{ 
    string head = "Hello world";
    @: <b>Привет мир!</b>
    head = head + "!!";
}
<p>@head</p>
Блоки кода в Razor в ASP.NET MVC

Если необходимо вывести значение переменной без каких-либо html-элементов, то мы можем использовать специальный снипет <text>:

@{
    int i = 8;
    <text>@i</text>
}
    <text>@(i+1)</text>

В Razor могут использоваться комментарии. Они располагаются между символами @**@:

@* текст комментария *@

Управляющие конструкции

Также мы можем использовать условные конструкции:

@{
    string head = "Привет мир";
    bool isEnabled = false;
}
@if (isEnabled)
{
    <p>Добро пожаловать</p>
}
else
{
    <p>@head</p>
}

Конструкция switch:

@{ 
    int x = 6;
}

@switch(x)
{
    case 5:
        <p>@(x* x)</p>
        break;
    case 6:
        <p>@(x+ x)</p>
        break;
}

Кроме того, мы можем использовать все возможные циклы. Цикл for:

@for (var i = 1; i < 6; i++)
{
    <p>Строка: @i</p>
}

Цикл while:

@{
    int x = 1;
}

@while(x<6)
{
    <p>Строка: @x</p>
    x++;
}

Цикл do..while:

@{
    int x = 1;
}

@do
{
    <p>Строка: @x</p>
    x++;
}
while (x < 6);
<p>Конец</p>

Цикл foreach:

@{
    string[] phones = { "Lumia 950", "iPhone 6S", "Galaxy S 6", "LG G4" };
}
<ul>
    @foreach (var phone in phones)
    {
        <li>@phone</li>
    }
</ul>

Конструкция try...catch...finally, как и в C#, позволяет обработать исключение, которое может возникнуть при выполнение кода:

@try
{
    throw new InvalidOperationException("Что-то пошло не так");
}
catch (Exception ex)
{
    <p>Возникло исключение: @ex.Message</p>
}
finally
{
    <p>Блок finally</p>
}

Если в блоке try выбрасывается исключение, то выполняется блок catch. И в любом случае в конце блока try и catch выполняется блок finaly.

Вывод текста в блоке кода

Обычный текст в блоке кода мы не сможем вывести:

@{
    bool isEnabled = true;
}
@if (isEnabled)
{
    Добро пожаловать
}

В этом случае Razor будет рассматривать строку "Добро пожаловать" как набор операторов языка C#, которых, естественно в C# нет, поэтому мы получим ошибку. И чтобы вывести текст как есть в блоке кода, нам надо использовать выражение @::

@{
    bool isEnabled = true;
}
@if (isEnabled)
{
    @: Добро пожаловать
}

Функции

Директива @functions позволяет определить функции, которые могут применяться в представлении. Например:

@functions
{
    public int GetFactorial(int n)
    {
        int result = 1;
        for (int i = 1; i <= n; i++)
            result *= i;
        return result;
    }
}
<div>Факториал числа 6 равен: @GetFactorial(6)</div>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850