Содержание
Как мы уже определили, компоненты Blazor — это самодостаточные элементы, которые могут содержать в себе в том числе и определенные свойства (параметры), отвечающие, например, за то, как будет отрисовываться компонент в окне браузера. Сегодня рассмотрим то, как можно передавать различные параметры компонентам Blazor.
Когда мы рассматривали тему маршрутизации в ASP.NET Core Blazor, то задавали параметры компонента Counter, используя параметры адресной строки браузера. При этом, для любого компонента Blazor можно также, как и для любого класса C# задавать свой набор свойств и определять их в приложении Blazor, не используя параметры маршрута.
Код компонента со свойствами
Вернемся к компоненту счётчика, который уже имеется в шаблоне приложения Blazor Server:
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
Например, нам необходимо, чтобы значение в зависимости от того, на какой странице используется этот компонент в окне браузера появлялось соответствующее сообщение. Перепишем компонент следующим образом:
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>@Message</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
[Parameter]
public string Message { get; set; } = "Счётчик на странице /counter";
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
Здесь у компонента Counter определено публичное свойство Message, обозначенное атрибутом [Parameter]. Значение этого свойства выводится в заголовке h1 в визуальной части компонента. Теперь мы можем использовать это свойство при использовании компонента в других частях нашего приложения. Например, зададим свойство Message при рендеринге компонента на главной странице приложения. Для этого перепишем код страницы Index.razor следующим образом:
@page "/" <PageTitle>Index</PageTitle> <h1>Hello, world!</h1> Welcome to your new app. <Counter Message="Счётчик на главной странице"/> <SurveyPrompt Title="How is Blazor working for you?" />
обратите внимание на то, как вызывается компонент Counter. Используя терминология HTML, мы прописали у компонента атрибут Message, который и есть наше публичной свойство. Теперь можно запустить приложение и посмотреть на результат:


Свойствам компонентов Blazor можно передавать и более ложные объекты, чем строки или числа. Например, добавим в компонент Counter новой свойство:
@page "/counter"
.....
{*Вывод содержимого нового свойства*}
<p>Содержимое списка строк (свойство Data)</p>
<ul>
@foreach(string element in Data)
{
<li>@element</li>
}
</ul>
.....
@code {
.....
[Parameter]
public List<string> Data { get; set; } = new List<string>();
.....
}
Теперь добавим на странице Index.razor следующий код:
@page "/"
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
{* Компонент Counter с новым свойством *}
<Counter Message="@message" Data="@elements"/>
<SurveyPrompt Title="How is Blazor working for you?" />
@code{
string message = "Пример передачи свойству списка строк";
List<string> elements = new List<string> { "Первый элемент", "Второй элемент", "Третий элемент" };
}
Теперь запустим приложение и посмотрим на результат:
Передача содержимого из родительского компонента в дочерний
В Blazor можно передавать некоторое содержимое из родительского компонента в дочерний. Для этого, у родительского компонента должно быть объявлено следующее свойство:
[Parameter]
public RenderFragment ChildContent{ get; set; }
Свойство должно определяться именно так и никак иначе, то есть: имя свойства ChildContent, а тип данных — RenderFragment. Теперь попробуем переписать код страницы SurveyPrompt.razor следующим образом:
<div class="alert alert-secondary mt-4">
<span class="oi oi-pencil me-2" aria-hidden="true"></span>
<strong>@Title</strong>
<span class="text-nowrap">
Please take our
<a target="_blank" class="font-weight-bold link-dark" href="https://go.microsoft.com/fwlink/?linkid=2149017">brief survey</a>
</span>
and tell us what you think.
<p>---------------------------</p>
@ChildContent
<p>---------------------------</p>
</div>
@code {
// Demonstrates how a parent component can supply parameters
[Parameter]
public string? Title { get; set; }
[Parameter]
public RenderFragment ChildContent{ get; set; }
}
У компонента SurveyPrompt мы определили свойство ChildContent. Теперь мы можем передавать в компонент SurveyPrompt некоторое содержимое. Чтобы посмотреть как это происходит, перепишем код страницы Index.razor (так как именно на этой странице мы вызываем компонент SurveyPrompt):
@page "/"
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" >
Это свойство ChildElement у компонента SurveyPrompt
</SurveyPrompt>
Теперь запустим наше приложение и посмотрим как содержимое из родительского компонента (Index) обрабатывается в дочернем компоненте (SurveyPrompt):
Итого
Сегодня мы научились работать со свойства компонентов Blazor, а также передавать содержимое из родительского компонента в дочерний. Для определения свойств компонента мы можем использовать атрибуты элемента (как в HTML).

