Вместо работы с данными как с отдельными значениями мы можем работать с данными как с объектами сложных типов. Например, пусть у нас в проекте есть класс Person и два компонента - корневой компонент App.razor и вложенный компонент Home.razor:
В классе Person определим два свойства - Name и Age:
public class Person { public string Name { get; set; } = ""; public int Age { get; set; } }
В компоненте App выводим компонент Home:
@page "/" <!DOCTYPE html> <html> <head> <title>METANIT.COM</title> <meta charset="utf-8" /> </head> <body> <Home /> <script src="_framework/blazor.web.js"></script> </body> </html>
А в компоненте Home выполняем привязку объекта Person к элементам формы:
@using Microsoft.AspNetCore.Components.Web @rendermode RenderMode.InteractiveServer <h2>Person</h2> <div> <p> Name:<br /> <input @bind-value="person.Name" /> </p> <p> Age:<br /> <input type="number" @bind-value="person.Age" /> </p> <button @onclick="Submit">Send</button> </div> <div> <p>Name @person.Name</p> <p>Age: @person.Age</p> </div> @code { Person person = new(); void Submit() { Console.WriteLine($"{person.Name} - {person.Age}"); } }
В компоненте App определен объект Person, свойства Name и Age которого привязаны к полям ввода. Для отслеживания ввода выводим автоматически значения этих свойств на страницу, а по нажатию на кнопку выводим их на консоль.
Подобным образом можно привязывать и другие элементы управления. Например, пусть класс Person определяет чуть больше свойств:
public class Person { public string Name { get; set; } = ""; public int Age { get; set; } public DateTime Day { get; set;} = DateTime.Now; public bool Working { get; set; } public string Subject { get; set; } = ""; public string[] Courses { get; set; } = []; }
В компоненте Home определим форму ввода для эти свойств:
@using Microsoft.AspNetCore.Components.Web @rendermode RenderMode.InteractiveServer <h2>Person</h2> <div> <p> Name:<br /> <input @bind="person.Name" /> </p> <p> Age:<br /> <input type="number" @bind="person.Age" /> </p> <p> Date:<br /> <input type="date" @bind="person.Day" /> </p> <p> Working:<br /> <input type="checkbox" @bind="person.Working" /> </p> <p> Subject:<br /> <input type="radio" name="subject" @onchange='@(()=>person.Subject = "Math")' />Math <br /> <input type="radio" name="subject" @onchange='@(()=>person.Subject = "Programming")' />Programming </p> <p> Courses:<br /> <select multiple @bind="person.Courses"> <option value="C#">C#</option> <option value="JavaScript">JavaScript</option> <option value="C++">C++</option> </select> </p> </div> <hr /> <div> <p>Name @person.Name</p> <p>Age: @person.Age</p> <p>Day: @person.Day.ToShortDateString()</p> <p>Working: @person.Working</p> <p>Subject: @person.Subject</p> <p>Courses: @string.Join(", ", person.Courses)</p> </div> @code { Person person = new(); }
Тут надо отметить, что для привязки свойства к элементу <select>
с атрибутом multiple
это свойство должно представлять массив (как в примере выше).
В случае с радиокнопками (<input type="radio">
) проверяем выбранную кнопку и в обработчике onchange
устанавливаем значение для свойства Subject.