Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Представление в 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>
Блоки кода могут иметь несколько выражений. Блок кода заключается в фигурные скобки, а каждое выражение завершается точкой с запятой аналогично блокам кода и выражениям на C#:
@{ string head = "Привет мир!!!"; head = head + " Добро пожаловать на сайт!"; } <h3>@head</h3>
В блоках кода мы можем определить обычные переменные и потом их использовать в представлении.
Весь код в пределах блока расценивается как код c#. Однако с помощью конструкции @:
мы можем в блоке кода выводить на веб-страницу текст:
@{ string head = "Hello world"; @: <b>Привет мир!</b> head = head + "!!"; } <p>@head</p>
Если необходимо вывести значение переменной без каких-либо 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>