Представления в ASP.NET Core MVC. Общие сведения о Razor

При изучении представлений в 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.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии