在 Blazor 应用程序中将控件绑定到数据

已完成

Blazor 使你能够将 HTML 控件绑定到属性,以便在用户界面 (UI) 中自动显示变化的值。

假设你正在开发一个页面,该页面从客户那里收集有关其披萨偏好的信息。 你想要从数据库加载该信息并使客户能够进行更改,例如记录他们最喜欢的配料。 当用户执行更改或数据库进行更新时,你希望尽快在 UI 中显示新值。

在本单元中,你将了解如何在 Blazor 中使用数据绑定将 UI 元素与数据值、属性或表达式相关联。

什么是数据绑定?

如果希望 HTML 元素显示值,可以编写代码来更改显示内容。 如果值发生更改,则需要编写额外的代码以更新显示内容。 在 Blazor 中,可以使用数据绑定将 HTML 元素连接到字段、属性或表达式。 这样,当值发生更改时,HTML 元素便会自动更新。 更新通常在更改后迅速发生,并且你无需编写任何更新代码。

若要绑定控件,可以使用 @bind 指令:

@page "/"

<p>
    Your email address is:
    <input @bind="customerEmail" />
</p>

@code {
    private string customerEmail = "user@contoso.com"
}

在上述页面中,每当 customerEmail 变量更改其值时,<input> 值都会更新。

备注

控件(如 <input>)仅在组件呈现时才会更新其显示内容,而在字段值发生更改时,它不会更新。 由于 Blazor 组件在执行任何事件处理程序代码后呈现,因此实际上通常会快速显示更新。

将元素绑定到特定事件

@bind 指令非常智能,并且了解它所使用的控件。 例如,在将值绑定到文本框 <input> 时,它将绑定 value 属性。 HTML 复选框 <input> 具有 checked 属性,而不是 value 属性。 @bind 属性将自动改用此 checked 属性。 默认情况下,该控件绑定到 DOM onchange 事件。 例如,请考虑以下页面:

@page "/"

<h1>My favorite pizza is: @favPizza</h1>

<p>
    Enter your favorite pizza:
    <input @bind="favPizza" />
</p>

@code {
    private string favPizza { get; set; } = "Margherita"
}

呈现该页时,默认值 Margherita 将同时显示在 <h1> 元素和文本框中。 在文本框中输入最喜欢的新披萨时,除非离开文本框或选择 Enter 键,否则 <h1> 元素不会发生更改,因为那时才会触发 onchange DOM 事件。

通常,这是你想要的行为。 但是,假设你希望在文本框中输入任何字符时 <h1> 元素会立即更新。 可以通过绑定到 oninput DOM 事件来实现这一结果。 若要绑定到此事件,必须使用 @bind-value@bind-value:event 指令:

@page "/"

<h1>My favorite pizza is: @favPizza</h1>

<p>
    Enter your favorite pizza:
    <input @bind-value="favPizza" @bind-value:event="oninput" />
</p>

@code {
    private string favPizza { get; set; } = "Margherita"
}

在此情况下,在文本框中键入任何字符时,标题会立即发生更改。

设置绑定值的格式

如果要向用户显示日期,可能需要使用本地化的数据格式。 例如,假设你要专门为英国用户(在写日期时,他们更喜欢先写日)编写一个页面。 可以使用 @bind:format 指令指定单个日期格式字符串:

@page "/ukbirthdaypizza"

<h1>Order a pizza for your birthday!</h1>

<p>
    Enter your birth date:
    <input @bind="birthdate" @bind:format="dd-MM-yyyy" />
</p>

@code {
    private DateTime birthdate { get; set; } = new(2000, 1, 1);
}

备注

编写时,仅支持日期值格式字符串。 将来可能会添加货币格式、数字格式以及其他格式。 若要查看有关绑定格式的最新信息,请参阅 Blazor 文档中的格式字符串

可以编写 C# 代码来设置绑定值的格式,作为使用 @bind:format 指令的一种替代方法。 在成员定义中使用 getset 访问器,如以下示例所示:

@page "/pizzaapproval"
@using System.Globalization

<h1>Pizza: @PizzaName</h1>

<p>Approval rating: @approvalRating</p>

<p>
    <label>
        Set a new approval rating:
        <input @bind="ApprovalRating" />
    </label>
</p>

@code {
    private decimal approvalRating = 1.0;
    private NumberStyles style = NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign;
    private CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
    
    private string ApprovalRating
    {
        get => approvalRating.ToString("0.000", culture);
        set
        {
            if (Decimal.TryParse(value, style, culture, out var number))
            {
                approvalRating = Math.Round(number, 3);
            }
        }
    }
}

在下一个单元中,你将应用所学知识。