Skip to content

Crud Операції в Blazor Server Side (SSR )

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 5,00 из 5)
Завантаження...

[ Полезный рекламный блок ]

Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.


У цьому уроці, ми розглянемо як швидко і просто реалізувати стандартний набір CRUD операцією в проекті Blazor Server.

Додаток буде керувати базою даних AnimalsDb, а його головна сторінка наприкінці буде виглядати, як показано вище.

У цьому проекті, я покажу альтернативні способи створення компонентів на основі «Scaffolding Tools».

Scaffolding Tools – потужний набір інструментів, який дає змогу автоматично створювати базовий код для веб-додатків на основі наявної бази даних або моделей даних. Вони спрощують і прискорюють процес розробки, даючи змогу генерувати стандартні CRUD (Create, Read, Update, Delete) операції та контролери для керування даними.

Створення та налаштування проекту

Щоб створити проєкт Animals, запустіть Visual Studio і виберіть у меню File (Файл) – New Project (Створити проєкт). Вкажіть шаблон проєкту Blazor Web App.

Введіть Animals, у полі Name, на наступній сторінці вкажіть .Net 8.0, Intractive render mode: Server, відзначимо checkbox для пункту – Include sample pages. Натисніть кнопку Create:

 Crud Операции в Blazor Server Side

На даний момент у нас є початковий проект. Давайте запустимо проект (Crtl + F5), щоб переконатися, що все в порядку:

blazor ss

Модель і Репозиторій

Модель для додатка Animals буде заснована на списку фільмів. Для цього реалізуємо клас Animals. Ми будемо використовувати цей клас з Entity Framework Core (EF Core) для роботи з базою даних. EF Core – це фреймворк об’єктно-реляційного відображення (ORM), який спрощує код доступу до даних. Класи моделей не мають залежності від EF Core. Вони просто визначають властивості даних, які зберігатимуться в базі даних.

Створіть папку Models і додайте в неї файл класу на ім’я Animal.cs з таким вмістом:

Потім додайте ще один клас під назвою AnimalType.cs, як показано нижче:

Настав час створити всі необхідні компоненти, використовуючи scaffolding. Натиснемо правою клавішею по папці Components / Pages і натиснемо правою клавішею мишки Add – New Scaffoldet Item – Razor Components using Entity Framework (CRUD):

blazor with ef core crud

У наступному вікні обираємо такі пункти:

blazor component with crud

Увага, ця опція доступна тільки з Visual Studio preview 17.9. Натискаємо кнопку «Add».

Якщо під час додавання виникла помилка, з таким вмістом:

«install the package microsoft.visualstudio.web.codegeneration.design and try again»

Перейдіть у DependenciesManage NuGet PackagesBrowse і вкажіть у пошуку:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Встановіть цю бібліотеку. ВАЖЛИВО! Якщо бібліотека вже встановлена і помилка, як і раніше, виникає, спробуйте перезібрати проєкт або ж перевстановити цю бібліотеку вручну.

На цьому етапі працює інструмент scaffolding. Автоматичне створення контексту бази даних і методів та подань CRUD (create, read, update, and delete) дій відомо як scaffolding.

Створені компоненти Razor додаються до папки Pages проєкту в згенеровану папку, названу за ім’ям класу моделі. Згенерований компонент Index використовує QuickGrid для відображення даних, про нього поговоримо трохи пізніше.

У нашому випадку, в папці Pages, з’явиться папка AnimalPages, з такими компонентами для CRUD операцій:

структура проекта blazor

У корені проекту можна побачити нову папку Data, зі згенерованим класом ApplicationContext:

ApplicationContext координує функціональність EF Core (Create, Read, Update, Delete тощо) для моделі Animal.

ASP.NET Core побудований з використанням ін’єкції залежностей (DI). Служби (наприклад, контекст БД EF Core) реєструються за допомогою DI під час запуску програми. Компоненти, яким потрібні ці служби, отримують їх через параметри конструктора:

Ім’я рядка підключення передається в контекст шляхом виклику методу на об’єкті DbContextOptions. Для локальної розробки система конфігурації ASP.NET Core зчитує рядок підключення з файлу appsettings.json, який уже успішно згенеровано з необхідним вмістом, перейдемо до файлу і зміни назву бази даних на AnimalDb:

Так само, в класі Program, можна побачити підключення такого компонента:

Компонент QuickGrid – це компонент Razor для швидкого й ефективного відображення даних у табличній формі. QuickGrid являє собою простий і зручний компонент сітки даних для поширених сценаріїв візуалізації сітки та слугує еталонною архітектурою і базою продуктивності для створення компонентів сітки даних. QuickGrid вирізняється високим ступенем оптимізації та використовує передові методи для досягнення оптимальної продуктивності рендерингу.

Він використовується на сторінках, де відображається зведена інформація, наприклад, відкриємо компонент Index.razor:

EF Core’s ApplicationContext надає властивість DbSet<TEntity> для кожної таблиці в базі даних. Вказуємо потрібну властивість у параметрі Items.

У наступному прикладі як джерело даних використовується DbSet<TEntity> (таблиця) Animal:

Ви також можете використовувати будь-який оператор LINQ, підтримуваний EF, для фільтрації даних перед передачею їх у параметр Items.

Наприклад, відобразимо тільки підвид риб:

QuickGrid розпізнає екземпляри IQueryable, що поставляються EF, і вміє виконувати запити асинхронно для підвищення ефективності.

Враховуйте, що компоненти, створені за допомогою скаффолдера, потребують рендерінгу на стороні сервера (SSR), тому вони не підтримуються під час роботи з WebAssembly.

На даному етапі, на сторінках Create.razor і Edit.razor, буде помилка, пов’язана з властивістю перерахуванням AnimalType, виправимо її, замінимо елемент InputText:

На елемент InputSelect:

Так само, давайте полегшимо пагінацію, вказавши посилання на маршрутизуємо компонент Index.razor, у компоненті NavMenu.razor:

Створення бази даних

Створимо базу даних за допомогою функції EF Core Migrations. Міграції дає нам змогу створити базу даних, що відповідає нашій моделі даних, і оновлювати схему бази даних у разі зміни моделі даних.

Відкрийте Tools -> NuGet Package Manager > Package Manager Console (PMC) і виконайте наступну команду в PMC:

PM> Add-Migration Initial

Команда Add-Migration генерує код для створення початкової схеми бази даних, що ґрунтується на моделі, зазначеній у класі ApplicationContext. Аргумент Initial – це ім’я міграції, можна використовувати будь-яке ім’я.

Після виконання команди в папці Migrations буде створено файл міграції:

blazor migrations

Як наступний крок виконайте наступну команду в Package Manager Console:

PM> Update-Database

Команда Update-Database запускає метод Up у файлі Migrations/{time-stamp}_InitialCreate.cs, який створює базу даних.

Первісне налаштування завершено, запустимо додаток і перевіримо його роботу:

blazor add component

Валідація даних

Застосування компонента EditForm дає змогу легко додати валідацію до форми. Для валідації даних нам потрібен валідатор – об’єкт, який визначає, як перевіряти коректність даних. За замовчуванням фреймворк Blazor надає валідатор анотацій даних – компонент DataAnnotationsValidator, який прикріплює до форми підтримку валідації за допомогою анотацій даних. Як і загалом у .NET, анотації даних у вигляді атрибутів дають змогу встановити правила валідації властивостей моделі.

За замовчуванням на сторінках Create.razor і Edit.razor, цей компонент уже доданий:

На страницу, добавлен компонент ValidationSummary, который выводит все сообщения об ошибках. На уровне разметки html генерируется html-элемент <ul> с классом validation-errors:

Також був доданий компонент ValidationMessage <T>, який відображає повідомлення про помилку для однієї властивості моделі. Цей компонент генерує html < div > елемент з класом validation-message, який містить повідомлення про помилку.

За допомогою властивості For компонент ValidationMessage встановлює властивість моделі, що валідується, через переданий лямбда-вираз.

Усе, що нам залишається зробити, то використовувати атрибути для нашого класу Animal:

Запустимо додаток і перевіримо його роботу:

blazor validation

Створення компонента оповіщення

Під час виконання якихось дій зручно буде використовувати компонент для оповіщення користувача.

У папці Components створимо папку Shared, усередині якої створимо компонент StatusMessage з таким вмістом:

Цей компонент побудований на використанні Bootstrap. У нашому випадку він стане в пригоді для відображення повідомлень 2-ух категорій: «Успішна операція» і «Помилка». Трохи пізніше ми використаємо його і ви побачите, як це просто.

Создание компонента для наполнения тестовыми данными

Нам необхідний компонент, який зможе заповнювати БД тестовими даними. Додайте в папку Components / Pages, нову папку DataPages, а в ній новий компонент Seed.razor, з таким вмістом:

Для роботи з EntityFrameworkCore і компонентом StatusMessage, обов’язково підключаємо такі простори імен:

Для зручності користувача додамо посилання на компонент в основному меню.

За замовчуванням, Blazor застосовує кілька іконок від бібліотеки Bootstrap Icons. Їх додавання можна знайти у файлі NavMenu.razor.css:

Подібним чином ви можете додати опис своїх іконок. У цьому файлі приберемо підключення старих іконок і змінимо клас .bi, таким чином:

Якщо ви захочете використовувати всі їхні іконки, то у файлі App.razor необхідно підключити їх за прямим посиланням або завантаживши в проєкт:

Перейдемо в Components / Layout / NavMenu.razor і змінимо його таким чином:

Зверніть увагу, я прибрав використання класу -nav-menu, для всіх посилань і в якості іконок вказав потрібні мені з підключеної бібліотеки.

Запустимо додаток і перевіримо його роботу:

server alert message

Пагінація компонента QuickGrid

Використовуючи компонент Seed, заповнимо таблицю на 10_000 рядків, після чого перейдемо в компонент Animals. Зверніть увагу на швидкість завантаження даних, воно займає щонайменше 5 секунд і в цей час користувач бачить порожню таблицю (він може подумати, що даних просто немає).

Перше, що ми можемо зробити, то якось повідомити користувача про те, що дані завантажуються. Для цього, змінимо компонент Index.razor, таким чином:

Угорі сторінки, було додано атрибут StreamRendering:

Цей атрибут діє тільки в рендері, що підтримує потоковий рендеринг (наприклад, рендеринг HTML на стороні сервера з кінцевої точки Razor Component).

Потоковий рендеринг означає, що контент компонента буде надіслано клієнту в міру готовності, а не очікувати, поки весь компонент буде повністю готовий до відображення.

Використання потокового рендерингу може поліпшити продуктивність і досвід користувача, особливо для великих компонентів або компонентів, що повільно завантажуються, оскільки користувач може бачити і взаємодіяти з частиною компонента, навіть якщо він ще не повністю завантажений.

Саме завдяки використанню цього атрибута, під час запуску компонента, ми можемо бачити процес завантаження:

blazor loading

Щойно колекцій animals буде заповнено, ми відобразимо її в таблиці.

Отримання та відображення великої кількості елементів може бути дорогим. Якщо обсяг відображуваних даних може бути великим, слід використовувати або пагінацію, або віртуалізацію.

Щоб увімкнути пагінацію, необхідно створити екземпляр PaginationState і передати його як властивість Pagination грида. Щоб забезпечити користувацький інтерфейс для пагінації, ми можемо використовувати вбудований компонент Paginator або створити власний користувацький інтерфейс, який зчитує і змінює екземпляр PaginationState.

Змінимо компонент Index.razor, таким чином:

Насамперед необхідно вказати, що компонент працює з інтерактивним рендерингом на сервері:

Запустіть сервер, завдяки з’єднанню SignalR між сервером і клієнтом відбуватиметься взаємодія. Це дасть змогу в даному випадку змінити кількість записів на сторінку, за допомогою списку, що випадає, прив’язаного до властивості ItemsPerPage, об’єкта pagination:

Як я вже говорив, щоб увімкнути пагінацію, необхідно створити екземпляр PaginationState:

І передати його як властивість Pagination грида:

Запустимо додаток і перевіримо його роботу:

blazor pagionation

Залишилося додати кнопки пагінації, у компоненті Index.razor, за компонентом QuickGrid, додамо компонент Paginator:

Запустимо додаток і перевіримо його роботу:

blazor pagionation buttons

Ви можете налаштувати зовнішній вигляд Paginator, надавши шаблон SummaryTemplate. Якщо вам потрібне додаткове налаштування, ви можете створити свій власний альтернативний користувацький інтерфейс, який працюватиме з PaginationState. Наприклад, відобразимо всі кнопки пагінації:

Сортування компонента QuickGrid

Сортуванням керують стовпці.

Для стовпця PropertyColumn сортування вмикається, якщо встановити Sortable=«true». Це слід робити тільки в тому разі, якщо ваше базове джерело даних підтримує сортування за виразом властивості цього стовпця.

Для стовпця TemplateColumn сортування вмикається, якщо ви задасте значення параметра SortBy цього стовпця.

Для користувацького стовпця, успадкованого від ColumnBase, сортування вмикається, якщо ви встановите Sortable=«true» або перевизначите IsSortableByDefault і повернете true.

Давайте застосуємо сортування для всіх стовпців, для цього в компоненті Index, змінимо вміст кожної колонки QuickGrid, додавши атрибут Sortable зі значенням true:

Як бачите, все просто. Запустимо додаток і перевіримо його роботу.

Фільтрація компонента QuickGrid

QuickGrid не потребує вбудованих API для фільтрації, тому ми можемо легко налаштувати власний користувацький інтерфейс для управління критеріями включення і потім використовувати його з джерелом даних.

Користувацький інтерфейс для управління критеріями фільтрації можна розмістити де завгодно і побудувати, використовуючи звичайні компоненти Blazor і прив’язки. Ми можемо використовувати функцію ColumnOptions у QuickGrid, щоб помістити користувацький інтерфейс фільтрації у спливаюче вікно, пов’язане з певним стовпцем.

Давайте реалізуємо можливість пошуку за властивістю Name, через спливаюче вікно елемента QuickGrid, для цього змінимо компонент Index.razor, таким чином:

Спочатку ми додали приватне поле класу, яке містить фільтр за ім’ям для тварин, а також приватну властивість класу, яка повертає відфільтрований набір тварин. Воно використовує LINQ-запит для фільтрації animals, ґрунтуючись на nameFilter.

Метод filteredAnimals() застосовує фільтрацію до списку тварин на основі значення nameFilter. Якщо nameFilter не порожнє, фільтрація здійснюється за ім’ям тварини, ігноруючи регістр символів. Фільтрований результат повертається з властивості filteredAnimals.

Після чого, для атрибута Items, компонента QuickGrid, застосовується колекція filteredAnimals.

Для колонки animal.Name додається модальне вікно з поміщеним усередині полем для введення тексту, яке прив’язане до поля nameFilter. Запустимо додаток і перевіримо його роботу:

blazor filtering

За таким самим принципом, ми можемо додавати можливості фільтрації для інших колонок, наприклад, додамо фільтр для колонки Weight:

Давайте створимо список, що випадає, для вибору певного типу тварини, для початку змінимо перерахування AnimalType, додавши йому константу All:

Тепер змінимо компонент Index.razor, таким чином:

Запустимо додаток і перевіримо його роботу:

blazor enum filter

Оскільки перерахування AnimalType набуло нової константи All, не забудьте її приховати в компонентах Create.razor і Edit.razor:

На цьому все. Обов’язково збережіть цей проєкт, він нам знадобиться для наступної теми проєкту.

Я сподіваюся, що вам сподобалося читати цю статтю, і вона виявилася легкою для розуміння. Будь ласка, дайте мені знати, якщо у вас є якісь коментарі або виправлення.

Так само вам може бути цікава попередня стаття – Проєкт із використанням Razor Pages (CRUD операції).

Ви хочете навчитися писати код мовою програмування C#?

Створювати різні інформаційні системи, що складаються з сайтів, мобільних клієнтів, десктопних додатків, телеграм-ботів тощо.

Переходьте до нас на сторінку Dijix і ознайомтеся з умовами навчання, ми спеціалізуємося тільки на індивідуальних заняттях, як для початківців, так і для просунутих програмістів. Ви можете взяти як одне заняття для опрацювання питання, що вас цікавить, так і кілька, для більш щільної роботи. Завдяки особистому кабінету, кожен студент підвищить якість свого навчання, у вашому розпорядженні:

  • Доступ до пройденого матеріалу
  • Тематичні статті
  • Бібліотека книг
  • Онлайн тестування
  • Спілкування в закритих групах

https://dijix.com.ua

Живи у своєму світі, програмуй у нашому.

Published inAsp.Net CoreBlazor Server
Підписатися
Сповістити про
guest
0 комментариев
Вбудовані Відгуки
Переглянути всі коментарі
0
Ми любимо ваші думки, будь ласка, прокоментуйте.x