Содержание
Прежде, чем мы перейдет к более глубокому изучению Blazor Hybrid, стоит хотя бы в общих чертах рассмотреть из чего складывается визуальный интерфейс нашего приложения, а именно — рассмотреть что из себя представляют компоненты Razor и как они компонуются в приложении.
Компоненты Razor
Во-первых, стоит сказать, что из себя представляет Razor, в принципе. Razor — это специальный язык разметки, позволяющие использовать инструкции и блоки кода C# внутри html-разметки. Все мы привыкли к тому, что на страницах веб-сайтов мы можем встретить смесь html+css+Js. Так вот, Razor позволяет при разработке приложения смешивать C# и HTML. В запущенном приложении разметка Razor будет преобразована в обычные элементы веб-страниц.
Компонент Razor — это автономная часть пользовательского интерфейса с логикой обработки, предназначенная для реализации динамического поведения. В физическом плане компонент Razor это, обычно, файл с расширением .razor
. Вернемся к нашему первому приложению Blazor Hybrid и посмотрим на его структуру ещё раз:
Здесь мы видим семь файлов с расширением
.razor
и из них шесть — это компоненты Razor. Файл _Imports.razor
используется для указания пространств имен, используемых во всех компонентах Razor и выглядит следующим образом:
@using System.Net.Http @using System.Net.Http.Json @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using HelloBlazorHybrid @using HelloBlazorHybrid.Components
Все компоненты Razor, условно, можно разделить на три категории — это страницы, макеты и, собственно, все прочие компоненты (элементы управления, компоненты таблиц и т.д.).
Элементы управления
Например, в нашем приложении определен компонент под названием NavMenu
. Это то самое меню навигации, которое мы видим при запуске приложения в сайдбаре:
то есть, в данном случае, NavMenu.razor
— это компонент элементу управления. Если посмотреть на код этого компонента, то мы увидим знакомую нам html-разметку документа:
При этом, обратите внимание, что некоторые тэги в разметке выделяются зеленым цветом — это так же компоненты Razor, которые встраиваются в компонент NavMenu
Таким образом, в приложениях Blazor в общем и в Blazor Hybrid, в частности, разбивать пользовательский интерфейс приложения на отдельные автономные части (компоненты) и создавать из этих частей пользовательский интерфейс, используя привычную нам html-разметку.
Макеты
Макет — это компонент Razor, который позволяет компоновать различные совместно используемые компоненты. Макеты наследуются от специального класса LayoutComponentBase
. В нашем приложении определен компонент макета — MainLayout
, а совместно используемым компонентом является NavMenu
— мы видим этот компонент всегда, на какой странице мы бы не находились. Посмотрим содержимое макета:
Внутри макета в каком-либо месте разметки мы всегда можем увидеть специальное выражение:
@Body
строка, начинающаяся с символа @
внутри html-разметки — это выражение Razor, которое вычисляет выражение C# и отрисовывает его содержимое в html-разметке. В случае макета мы отрисовываем содержимое свойства Body
родительского класса LayoutComponentBase
. То есть, вместо этого выражения будут выводиться страницы приложения с размещенными в них прочими компонентами Razor.
Так как макеты и совместно используемые компоненты Razor используются во всем приложении, то, обычно их размещаются в папке Shared
или, как в нашем случае, в папке Layout
.
Страницы
Страницы — это маршрутизируемые компоненты Razor. Такие компоненты отличает то, что у них определена директива @page
в которой указывается путь к компоненту. В нашем приложении все страницы располагаются в папке /Components/Pages
:
Посмотрим, например, код страницы Home.razor
:
@page "/" <h1>Hello, world!</h1> Welcome to your new app.
Здесь мы, опять же, видим html-разметку, а также директиву @page
в которой указан путь к странице. Если теперь сопоставить этот код с кодом макета приложения, то при работе приложения, если пользователь переходит по ссылке Home мы получаем следующее:
То есть, если представить этот рисунок в виде обычного html-кода, то мы получим следующую разметку:
<div class="page"> <div class="sidebar"> <div class="top-row ps-3 navbar navbar-dark"> <div class="container-fluid"> <a class="navbar-brand" href="">HelloBlazorHybrid</a> </div> </div> <input type="checkbox" title="Navigation menu" class="navbar-toggler" /> <div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()"> <nav class="flex-column"> <div class="nav-item px-3"> <NavLink class="nav-link" href="/" Match="NavLinkMatch.All"> <span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home </NavLink> </div> <div class="nav-item px-3"> <NavLink class="nav-link" href="counter"> <span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter </NavLink> </div> <div class="nav-item px-3"> <NavLink class="nav-link" href="weather"> <span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather </NavLink> </div> </nav> </div> </div> <main> <div class="top-row px-4"> <a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a> </div> <article class="content px-4"> <h1>Hello, world!</h1> Welcome to your new app. </article> </main> </div>
Здесь, как мы видим, отсутствуют такие важные для html-страницы html-тэги, как <body>
, <head>
и так далее.
Стартовая страница index.html
Весь основной «скелет» html-страниц, которые мы загружаем в приложении, располагается в файле wwwroot/index.html
При первом запросе любой страницы приложения именно этот файл преобразовывается для просмотра и возвращается в ответе. В файле index.html, помимо всего прочего, указывается место отрисовки корневого компонента App
. Посмотрим на код этого файла:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" /> <title>HelloBlazorHybrid</title> <base href="/" /> <link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" /> <link rel="stylesheet" href="css/app.css" /> <link rel="stylesheet" href="HelloBlazorHybrid.styles.css" /> <link rel="icon" href="data:,"> </head> <body> <div class="status-bar-safe-area"></div> <div id="app">Loading...</div> <div id="blazor-error-ui"> An unhandled error has occurred. <a href="" class="reload">Reload</a> <a class="dismiss">🗙</a> </div> <script src="_framework/blazor.webview.js" autostart="false"></script> </body> </html>
Как мы видим — это обычная html-страница, содержащая основные html-тэги. Здесь мы подключаем необходимые нам css, включая и css-фреймворк bootstrap, определяем кодировку содержимого и т.д. Внутри тэга <body>
это страницы размещаются два важных для нас элемента, а именно:
- Скрипт
<script src="_framework/blazor.webview.js" autostart="false"></script>
который используется, в том числе, для обработки различных событий в приложении, например, клики по кнопкам - Элемент
<div id="app">Loading...</div>
внутри этого тэга выводится содержимое нашего приложения.
Например, запустите приложение в Windows и нажмите клавишу F12 — запустятся инструменты разработчика где мы можем увидеть всю структуру DOM:
То есть, вместо строки «Loading…» было загружено содержимое макета, включая все компоненты Razor.
Таким образом, в общих чертах, пользовательский интерфейс в приложении Blazor складывается следующим образом:
Компонент Routes
Отдельно стоит обратить внимание также на компонент Routes
. Его код выглядит следующим образом:
<Router AppAssembly="@typeof(MauiProgram).Assembly"> <Found Context="routeData"> <RouteView RouteData="@routeData" DefaultLayout="@typeof(Layout.MainLayout)" /> <FocusOnNavigate RouteData="@routeData" Selector="h1" /> </Found> </Router>
Здесь расположен специальный компонент Router
, который отвечает за маршрутизацию в приложении. В атрибуте AppAssembly
указывается сборка внутри которой необходимо искать маршрутизируемые компоненты. У компонента Router
определено свойство Found
которое возвращает (или задает) содержимое, соответствующее определенному URI. С этим компонентом мы обязательно разберемся более детально в одной из следующих частей руководства.
Итого
Пользовательский интерфейс приложения Blazor Hybrid строится с использованием языка разметки Razor, который позволяет использовать C# внутри разметки html. Используя Razor мы можем создавать компоненты — автономные части пользовательского интерфейса из которых складывается визуальная часть приложения. Маршрутизируемые компоненты Razor (страницы) размещаются внутри макета и содержат необходимые для работы элементы управления, которые также могут выделяться в отдельные компоненты Razor.