Содержание
При изучении представлений в ASP.NET Core MVC невозможно обойти стороной такую тему как разметка Razor. Razor позволяет достаточно легко переходить от разметки html в представлении к коду C#, вычислять выражения C# и отрисовывать их в выходных данных в виде HTML-разметки.
Разметка Razor
Разметка Razor начинается с символа @. Например, если мы посмотрим на файл представления, который мы создали в предыдущей части, то увидим следующие код:
@*
For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
<h2>Последние записи блога</h2>
@{
}
здесь мы видим, что комментарии в представлениях с Razor обрамляются символами @*. Также, в этом представлении уже обозначен блок, в котором мы можем использовать C#-код:
@{
}
Используя символ @ мы можем легко переключаться с html на C#. Например, изменим код нашего представления следующим образом:
@*
For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
<h2>Последние записи блога на момент @DateOnly.FromDateTime(DateTime.Now)</h2>
@{
}
здесь мы использовали так называемое неявное выражение Razor, которое начинается с @ и сразу за этим символом идёт выражение C#. В данном случае, мы пытаемся вывести текущую дату пользователю. В рабочем приложении это будет выглядеть следующим образом:
В свою очередь, явные выражения Razor располагаются внутри @(). Например, добавим в наше представление новый блок:
@*
For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
<h2>Последние записи блога на момент @DateOnly.FromDateTime(DateTime.Now)</h2>
@*Здесь будут выводиться записи за прошлую неделю*@
<h2>Записи за прошлую неделю: с @((DateTime.Now - TimeSpan.FromDays(7)).ToShortDateString()) по @DateOnly.FromDateTime(DateTime.Now)</h2>
@{
}
здесь мы определили явное выражение Razor:
@((DateTime.Now - TimeSpan.FromDays(7)).ToShortDateString())
явные выражения Razor позволяют уже выполнять какие-то действия C#. Например, как в нашем случае — мы отнимаем от текущей даты семь дней.
Также, бывает необходимо не просто вывести какое-либо значение на страницу, но перед этим, произвести какие-либо вычисления с переменной. В этом случае, мы можем использовать следующую конструкцию Razor — @{} где внутри фигурных скобок мы можем осуществлять какие-либо вычисления. Например,
@{
DateOnly date = DateOnly.FromDateTime(DateTime.Now);
DateOnly lastweekStart = DateOnly.FromDateTime(DateTime.Now.AddDays(-7));
}
здесь мы объявили две переменные типа DateOnly и присвоили им значения. Теперь мы можем изменить наше представление следующим образом:
@*Здесь располагается код C#*@
@{
DateOnly date = DateOnly.FromDateTime(DateTime.Now);
DateOnly lastweekStart = DateOnly.FromDateTime(DateTime.Now.AddDays(-7));
}
<h2>Последние записи блога на момент @date</h2>
@*Здесь будут выводиться записи за прошлую неделю*@
<h2>Записи за прошлую неделю: с @lastweekStart по @date</h2>
Результат выполнения рендеринга этого представления будет выглядеть следующим образом:
Также, Razor поддерживает различные конструкции с помощью которых мы можем осуществлять перебор элементов в циклах, проверять условия и т.д. Кратко рассмотрим эти конструкции.
Условные конструкции
Конструкция if..else
Для использования условного оператора if..else непосредственно в коде представления можно использовать одноименную конструкцию Razor. Например, добавим в наше представление следующий код:
@if ((date.DayOfWeek == DayOfWeek.Saturday) || (date.DayOfWeek == DayOfWeek.Sunday))
{
<h2 style="color: red;">Последние записи блога на момент @date</h2>
}
else
{
<h2>Последние записи блога на момент @date</h2>
}
здесь мы проверяем, если день недели суббота или воскресенье, то заголовок последних записей блога будет выводиться красным цветом, иначе — черным. Так как этот код был написан в субботу, то результат будет таким:
Конструкция switch
Перепишем код выше следующим образом:
@switch (date.DayOfWeek)
{
case DayOfWeek.Sunday:
case DayOfWeek.Saturday:
{
<h2 style="color: red;">Последние записи блога на момент @date</h2>
break;
}
default:
{
<h2>Последние записи блога на момент @date</h2>
break;
}
}
результат выполнения будет тот же, что и на рисунке выше.
Циклы
С помощью циклов удобно формировать различные списки в HTML-коде. Например, выведем заголовки последних записей блога на странице, используя различные виды циклов.
Цикл for
@{
DateOnly date = DateOnly.FromDateTime(DateTime.Now);
DateOnly lastweekStart = DateOnly.FromDateTime(DateTime.Now.AddDays(-7));
//Условная БД с заголовками статей блога
string[] Titles = new[]
{
"Hello, world!",
"Знакомство с Razor в ASP.NET Core MVC",
"Разметка Razor"
};
}
@switch (date.DayOfWeek)
{
case DayOfWeek.Sunday:
case DayOfWeek.Saturday:
{
<h2 style="color: red;">Последние записи блога на момент @date</h2>
break;
}
default:
{
<h2>Последние записи блога на момент @date</h2>
break;
}
}
<ul>
@for (int i = 0; i < Titles.Length; i++)
{
<li>@Titles[i]</li>
}
</ul>
здесь мы определили условную БД, содержащую заголовки последних записей блога и, ниже, в цикле for выводим эти заголовки на странице:
<ul>
@for (int i = 0; i < Titles.Length; i++)
{
<li>@Titles[i]</li>
}
</ul>
результат:
Цикл foreach
<ul>
@foreach (var title in Titles)
{
<li>@title</li>
}
</ul>
Результат работы будет такой же, как на рисунке выше.
Цикл while
@{
int i = 0;
}
<ul>
@while (i<Titles.Length)
{
<li>@Titles[i]</li>
i++;
}
</ul>
Цикл do..while
@{
int i = 0;
}
<ul>
@do
{
<li>@Titles[i]</li>
}
while (++i < Titles.Length);
</ul>
Обработка исключений
Также, мы можем использовать блоки try...catch:
@try
{
int data = 0;
var res = 10 / data;
}
catch
{
<p style="color: red">Здесь произошла ошибка</p>
}
Функции
Директива @functions позволяет определить функции, которые могут применяться в представлении. Например:
@functions
{
public string Print(IEnumerable<string> titles)
{
return string.Join(" ", titles);
}
}
Результат
Итого
В этой части мы познакомились в общих чертах с разметкой Razor и её применении для создания представлений в ASP.NET Core MVC. Используя Razor, мы можем создавать циклы, использовать условные операторы, производить вычисления на языке C#, а затем выводить эти представления в виде HTML.

