Создание приложения Blazor со списком дел
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 9 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 9 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 9 этой статьи.
В этом руководстве представлен базовый рабочий процесс для создания и изменения Blazor приложения. Подробные Blazor инструкции см. в справочной Blazor документации.
Вы узнаете, как выполнять следующие задачи:
- создавать проект приложения Blazor со списком задач;
- изменять компоненты Razor;
- использовать обработку событий и привязку данных в компонентах;
- Использование маршрутизации в приложении Blazor
Когда вы выполните задачи из этого руководства, у вас будет работающее приложение списка задач.
Необходимые компоненты
Скачайте и установите .NET , если он еще не установлен в системе или если у системы нет последней версии.
Создание приложения Blazor
Создайте новое Blazor Web App имя TodoList
в командной оболочке:
dotnet new blazor -o TodoList
Параметр -o|--output
создает папку для проекта. Если вы создали папку для проекта и она открыта в оболочке командной строки, не указывайте параметр -o|--output
и значение для создания проекта.
Используйте любую из следующих моделей размещения для создания нового Blazor приложения с именем TodoList
в командной оболочке:
Для работы с Blazor Serverприложением создайте приложение со следующей командой:
dotnet new blazorserver -o TodoList
Для работы с Blazor WebAssemblyприложением создайте приложение со следующей командой:
dotnet new blazorwasm -o TodoList
Предыдущая команда создает папку с именем TodoList
и параметром -o|--output
для хранения приложения. Папка TodoList
находится в корневой папке проекта. Перейдите в папку TodoList
с помощью следующей команды:
cd TodoList
Создание приложения Blazor со списком дел
Добавьте в приложение новый компонент Todo
Razor с помощью приведенной ниже команды.
dotnet new razorcomponent -n Todo -o Components/Pages
Параметр -n|--name
в предыдущей команде задает имя нового компонента Razor. Новый компонент создается в папке Components/Pages
проекта с параметром -o|--output
.
dotnet new razorcomponent -n Todo -o Pages
Параметр -n|--name
в предыдущей команде задает имя нового компонента Razor. Новый компонент создается в папке Pages
проекта с параметром -o|--output
.
Внимание
Имена файлов компонентов Razor должны начинаться с прописной буквы. Откройте папку Pages
и убедитесь, что имя файла компонента Todo
начинается с прописной буквы T
. Имя файла должно быть Todo.razor
.
Todo
Откройте компонент в любом редакторе файлов и внесите следующие изменения в верхней части файла:
- Добавьте директиву
@page
Razor с относительным URL-адресом/todo
. - Включите интерактивность на странице, чтобы она не только отображалась статически. Режим отрисовки интерактивного сервера позволяет компоненту обрабатывать события пользовательского интерфейса с сервера.
- Добавьте заголовок страницы с
PageTitle
компонентом, который позволяет добавить элемент HTML<title>
на страницу.
Todo
Откройте компонент в любом редакторе файлов и внесите следующие изменения в верхней части файла:
- Добавьте директиву
@page
Razor с относительным URL-адресом/todo
. - Добавьте заголовок страницы с
PageTitle
компонентом, который позволяет добавить элемент HTML<title>
на страницу.
Todo
Откройте компонент в любом редакторе файлов и добавьте директиву @page
Razor с относительным URL-адресом/todo
.
Todo.razor
:
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
@code {
}
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
@code {
}
@page "/todo"
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
@code {
}
@page "/todo"
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
@code {
}
@page "/todo"
<h3>Todo</h3>
@code {
}
@page "/todo"
<h3>Todo</h3>
@code {
}
Сохраните файл Todo.razor
.
Добавьте компонент Todo
на панель навигации.
Компонент NavMenu
используется в макете приложения. Макеты — это компоненты, которые позволяют избежать дублирования содержимого в приложении. Компонент NavLink
предоставляет подсказку в пользовательском интерфейсе приложения, когда URL-адрес компонента загружается приложением.
В содержимом элемента навигации (<nav>
) компонента NavMenu
добавьте следующий элемент <div>
для компонента Todo
.
В Components/Layout/NavMenu.razor
:
В Shared/NavMenu.razor
:
<div class="nav-item px-3">
<NavLink class="nav-link" href="todo">
<span class="oi oi-list-rich" aria-hidden="true"></span> Todo
</NavLink>
</div>
Сохраните файл NavMenu.razor
.
Скомпилируйте и запустите приложение, выполнив команду dotnet watch run
в командной оболочке из папки TodoList
. После запуска приложения перейдите на страницу списка дел, щелкнув ссылку Todo
на панели навигации приложения. В результате будет загружена страница по адресу /todo
.
Оставьте приложение выполняться в командной оболочке. При каждом сохранении файла приложение автоматически перестраивается, а страница в браузере автоматически перезагружается.
Добавьте в корень проекта (папка TodoItem.cs
) файл TodoList
, который будет содержать класс для элемента списка дел. Используйте следующий код C# для класса TodoItem
.
TodoItem.cs
:
public class TodoItem
{
public string? Title { get; set; }
public bool IsDone { get; set; }
}
public class TodoItem
{
public string? Title { get; set; }
public bool IsDone { get; set; }
}
public class TodoItem
{
public string? Title { get; set; }
public bool IsDone { get; set; }
}
public class TodoItem
{
public string? Title { get; set; }
public bool IsDone { get; set; }
}
public class TodoItem
{
public string Title { get; set; }
public bool IsDone { get; set; }
}
public class TodoItem
{
public string Title { get; set; }
public bool IsDone { get; set; }
}
Примечание.
При использовании Visual Studio для создания файла и TodoItem.cs
класса используйте TodoItem
следующих подходов:
- Удалите пространство имен, создаваемое Visual Studio для класса.
- Воспользуйтесь кнопкой Копировать в предыдущем блоке кода и замените все содержимое файла, создаваемого Visual Studio.
Вернитесь к компоненту Todo
и выполните указанные ниже задачи.
- Добавьте поле для элементов списка дел в блоке
@code
. КомпонентTodo
использует это поле для сохранения состояния списка дел. - Добавьте разметку неупорядоченного списка и цикл
foreach
, чтобы отобразить каждый элемент списка дел как элемент списка (<li>
).
Components/Pages/Todo.razor
:
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
@code {
private List<TodoItem> todos = [];
}
Components/Pages/Todo.razor
:
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
@code {
private List<TodoItem> todos = [];
}
Pages/Todo.razor
:
@page "/todo"
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
@code {
private List<TodoItem> todos = new();
}
Pages/Todo.razor
:
@page "/todo"
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
@code {
private List<TodoItem> todos = new();
}
Pages/Todo.razor
:
@page "/todo"
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
@code {
private List<TodoItem> todos = new();
}
Pages/Todo.razor
:
@page "/todo"
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
@code {
private IList<TodoItem> todos = new List<TodoItem>();
}
Приложению требуются элементы пользовательского интерфейса для добавления элементов списка дел. Добавьте следующие входные данные (<input>
) и кнопку (<button>
) под неупорядоченным списком (<ul>...</ul>
):
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" />
<button>Add todo</button>
@code {
private List<TodoItem> todos = [];
}
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" />
<button>Add todo</button>
@code {
private List<TodoItem> todos = [];
}
@page "/todo"
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" />
<button>Add todo</button>
@code {
private List<TodoItem> todos = new();
}
@page "/todo"
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" />
<button>Add todo</button>
@code {
private List<TodoItem> todos = new();
}
@page "/todo"
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" />
<button>Add todo</button>
@code {
private List<TodoItem> todos = new();
}
@page "/todo"
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" />
<button>Add todo</button>
@code {
private IList<TodoItem> todos = new List<TodoItem>();
}
Сохраните файл TodoItem.cs
и обновленный файл Todo.razor
. При сохранении файлов в командной оболочке будет автоматически выполнена повторная сборка приложения. Браузер перезагружает страницу.
При нажатии кнопки Add todo
ничего не происходит, так как к кнопке не подключен обработчик событий.
Добавьте метод AddTodo
в компонент Todo
и зарегистрируйте метод для кнопки с помощью атрибута @onclick
. Метод AddTodo
C# вызывается при нажатии кнопки:
<input placeholder="Something todo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = [];
private void AddTodo()
{
// Todo: Add the todo
}
}
<input placeholder="Something todo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = [];
private void AddTodo()
{
// Todo: Add the todo
}
}
<input placeholder="Something todo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = new();
private void AddTodo()
{
// Todo: Add the todo
}
}
<input placeholder="Something todo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = new();
private void AddTodo()
{
// Todo: Add the todo
}
}
<input placeholder="Something todo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = new();
private void AddTodo()
{
// Todo: Add the todo
}
}
<input placeholder="Something todo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private IList<TodoItem> todos = new List<TodoItem>();
private void AddTodo()
{
// Todo: Add the todo
}
}
Чтобы получить заголовок нового элемента списка дел, добавьте строковое поле newTodo
в верхней части блока @code
:
private string? newTodo;
private string newTodo;
Измените текстовый элемент <input>
, чтобы привязать newTodo
с помощью атрибута @bind
.
<input placeholder="Something todo" @bind="newTodo" />
Обновите метод AddTodo
, чтобы добавить TodoItem
с указанным заголовком в список. Очистите значение текстового ввода, указав для newTodo
пустую строку:
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = [];
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = [];
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
@page "/todo"
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = new();
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
@page "/todo"
<PageTitle>Todo</PageTitle>
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = new();
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
@page "/todo"
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = new();
private string newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
@page "/todo"
<h3>Todo</h3>
<ul>
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private IList<TodoItem> todos = new List<TodoItem>();
private string newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
Сохраните файл Todo.razor
. Приложение в командной оболочке будет автоматически перестроено, а страница в браузере будет перезагружена.
Вы можете сделать текст заголовка для каждого элемента списка дел редактируемым, а флажки помогут пользователю отслеживать завершение задач в списке дел. Добавьте флажок для каждого элемента списка дел и привяжите его значение к свойству IsDone
. Измените @todo.Title
на элемент <input>
, привязанный к todo.Title
с @bind
:
<ul>
@foreach (var todo in todos)
{
<li>
<input type="checkbox" @bind="todo.IsDone" />
<input @bind="todo.Title" />
</li>
}
</ul>
Обновите заголовок <h3>
, чтобы отобразить количество не завершенных элементов списка дел (IsDone
имеет значение false
). Выражение Razor в следующем заголовке вычисляется каждый раз, когда Blazor отрисовывает компонент.
<h3>Todo (@todos.Count(todo => !todo.IsDone))</h3>
Завершенный Todo
компонент:
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h1>Todo (@todos.Count(todo => !todo.IsDone))</h1>
<ul>
@foreach (var todo in todos)
{
<li>
<input type="checkbox" @bind="todo.IsDone" />
<input @bind="todo.Title" />
</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = [];
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h1>Todo (@todos.Count(todo => !todo.IsDone))</h1>
<ul>
@foreach (var todo in todos)
{
<li>
<input type="checkbox" @bind="todo.IsDone" />
<input @bind="todo.Title" />
</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = [];
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
@page "/todo"
<PageTitle>Todo</PageTitle>
<h1>Todo (@todos.Count(todo => !todo.IsDone))</h1>
<ul>
@foreach (var todo in todos)
{
<li>
<input type="checkbox" @bind="todo.IsDone" />
<input @bind="todo.Title" />
</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = new();
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
@page "/todo"
<PageTitle>Todo</PageTitle>
<h1>Todo (@todos.Count(todo => !todo.IsDone))</h1>
<ul>
@foreach (var todo in todos)
{
<li>
<input type="checkbox" @bind="todo.IsDone" />
<input @bind="todo.Title" />
</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = new();
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
@page "/todo"
<h1>Todo (@todos.Count(todo => !todo.IsDone))</h1>
<ul>
@foreach (var todo in todos)
{
<li>
<input type="checkbox" @bind="todo.IsDone" />
<input @bind="todo.Title" />
</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = new();
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
@page "/todo"
<h1>Todo (@todos.Count(todo => !todo.IsDone))</h1>
<ul>
@foreach (var todo in todos)
{
<li>
<input type="checkbox" @bind="todo.IsDone" />
<input @bind="todo.Title" />
</li>
}
</ul>
<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>
@code {
private List<TodoItem> todos = new();
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}
Сохраните файл Todo.razor
. Приложение в командной оболочке будет автоматически перестроено, а страница в браузере будет перезагружена.
Добавление элементов, изменение элементов и пометка элементов списка дел как выполненных для тестирования компонента.
По окончании завершите работу приложения в командной оболочке. Многие оболочки команд принимают команду клавиатуры CTRL+C, чтобы остановить приложение.
Публикация в Azure
Сведения о развертывании в Azure см. в разделе Краткое руководство. Развертывание веб-приложения ASP.NET.
Следующие шаги
Из этого руководства вы узнали, как:
- создавать проект приложения Blazor со списком задач;
- изменять компоненты Razor;
- использовать обработку событий и привязку данных в компонентах;
- Использование маршрутизации в приложении Blazor
Подробные сведения об инструментах для ASP.NET Core Blazor:
ASP.NET Core