共用方式為


表單和驗證

提示

本內容節錄自《Blazor for ASP NET Web Forms Developers for Azure》電子書,可以從 .NET Docs 取得,也可以免費下載 PDF 離線閱讀。

Blazor-for-ASP-NET-Web-Forms-Developers eBook cover thumbnail.

ASP.NET Web Forms 架構包括一組驗證伺服器控制項,可處理驗證在表單中輸入的使用者輸入 (RequiredFieldValidatorCompareValidatorRangeValidator 等)。 ASP.NET Web Forms 架構也支援模型繫結,並根據資料註釋 ([Required][StringLength][Range] 等) 驗證模型。 驗證邏輯可以在伺服器和用戶端上,使用不顯眼的 JavaScript 型驗證強制執行。 ValidationSummary 伺服器控制項用於向使用者顯示驗證錯誤的摘要。

Blazor 支援在用戶端與伺服器之間共用驗證邏輯。 ASP.NET 提供許多常見伺服器驗證的預先建置 JavaScript 實作。 在許多情況下,開發人員仍然需要撰寫 JavaScript,才能完整實作其應用程式專用的驗證邏輯。 您可以在伺服器和用戶端上使用相同的模型類型、資料註釋和驗證邏輯。

Blazor 提供一組輸入元件。 輸入元件會處理將欄位資料繫結至模型,並在提交表單時驗證使用者輸入。

輸入元件 轉譯的 HTML 元素
InputCheckbox <input type="checkbox">
InputDate <input type="date">
InputNumber <input type="number">
InputSelect <select>
InputText <input>
InputTextArea <textarea>

EditForm 元件會包裝這些輸入元件,並透過 EditContext 協調驗證程序。 建立 EditForm 時,您可以使用 Model 參數指定要繫結的模型執行個體。 驗證通常是使用資料註釋來完成,而且是可延伸的。 若要啟用資料註釋型驗證,請新增 DataAnnotationsValidator 元件作為 EditForm 的子系。 EditForm 元件提供方便的事件來處理有效 (OnValidSubmit) 和無效 (OnInvalidSubmit) 提交。 另外還有一個更一般的 OnSubmit 事件,可讓您自行觸發和處理驗證。

若要顯示驗證錯誤摘要,請使用 ValidationSummary 元件。 若要顯示特定輸入欄位的驗證訊息,請使用 ValidationMessage 元件,為指向適當模型成員的 For 參數指定 Lambda 運算式。

下列模型類型會使用資料註釋定義數個驗證規則:

using System;
using System.ComponentModel.DataAnnotations;

public class Starship
{
    [Required]
    [StringLength(16,
        ErrorMessage = "Identifier too long (16 character limit).")]
    public string Identifier { get; set; }

    public string Description { get; set; }

    [Required]
    public string Classification { get; set; }

    [Range(1, 100000,
        ErrorMessage = "Accommodation invalid (1-100000).")]
    public int MaximumAccommodation { get; set; }

    [Required]
    [Range(typeof(bool), "true", "true",
        ErrorMessage = "This form disallows unapproved ships.")]
    public bool IsValidatedDesign { get; set; }

    [Required]
    public DateTime ProductionDate { get; set; }
}

下列元件示範在 Blazor 中,根據 Starship 模型類型建置表單:

<h1>New Ship Entry Form</h1>

<EditForm Model="@starship" OnValidSubmit="@HandleValidSubmit">
    <DataAnnotationsValidator />
    <ValidationSummary />

    <p>
        <label for="identifier">Identifier: </label>
        <InputText id="identifier" @bind-Value="starship.Identifier" />
        <ValidationMessage For="() => starship.Identifier" />
    </p>
    <p>
        <label for="description">Description (optional): </label>
        <InputTextArea id="description" @bind-Value="starship.Description" />
    </p>
    <p>
        <label for="classification">Primary Classification: </label>
        <InputSelect id="classification" @bind-Value="starship.Classification">
            <option value="">Select classification ...</option>
            <option value="Exploration">Exploration</option>
            <option value="Diplomacy">Diplomacy</option>
            <option value="Defense">Defense</option>
        </InputSelect>
        <ValidationMessage For="() => starship.Classification" />
    </p>
    <p>
        <label for="accommodation">Maximum Accommodation: </label>
        <InputNumber id="accommodation" @bind-Value="starship.MaximumAccommodation" />
        <ValidationMessage For="() => starship.MaximumAccommodation" />
    </p>
    <p>
        <label for="valid">Engineering Approval: </label>
        <InputCheckbox id="valid" @bind-Value="starship.IsValidatedDesign" />
        <ValidationMessage For="() => starship.IsValidatedDesign" />
    </p>
    <p>
        <label for="productionDate">Production Date: </label>
        <InputDate id="productionDate" @bind-Value="starship.ProductionDate" />
        <ValidationMessage For="() => starship.ProductionDate" />
    </p>

    <button type="submit">Submit</button>
</EditForm>

@code {
    private Starship starship = new Starship();

    private void HandleValidSubmit()
    {
        // Save the data
    }
}

在表單提交之後,模型繫結的資料尚未儲存至任何資料存放區,例如資料庫。 在 Blazor WebAssembly 應用程式中,資料必須傳送至伺服器。 例如,使用 HTTP POST 要求。 在 Blazor 伺服器應用程式中,資料已在伺服器上,但必須加以保存。 在 Blazor 應用程式中處理資料存取是處理資料一節的主題。

其他資源

如需有關 Blazor 應用程式中表單和驗證的詳細資訊,請參閱 Blazor 文件。