Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Esta não é a versão mais recente deste artigo. Para ver a versão atual, consulte a versão .NET 10 deste artigo.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, consulte o .NET e .NET Core Support Policy. Para ver a versão atual, consulte a versão .NET 10 deste artigo.
Este artigo explica como validar a entrada do usuário em Blazor formulários.
Para a maioria dos formulários, a abordagem mais simples e recomendada é adicionar atributos de validação de anotações de dados ao modelo e colocar um DataAnnotationsValidator componente no EditForm. Blazor também oferece suporte à validação personalizada por meio de EditContext do formulário, seja diretamente no componente de formulário ou em um componente de validação reutilizável.
Os artigos relacionados fornecem mais detalhes:
- Para escrever e configurar regras de validação baseadas em modelo, incluindo regras personalizadas e assíncronas, validação de objeto aninhada e localização, consulte Validação em ASP.NET Core.
- Para obter a validação em tempo real no navegador na renderização estática no servidor (SSR estático), consulte ASP.NET Core Blazor validação de formulários no lado do cliente no SSR estático.
- Para implementações completas de validador-componente e validação remota, consulte ASP.NET Core Blazor validação de formulário avançada.
- Para escrever e configurar regras de validação baseadas em modelo e validação de objeto aninhado, consulte Validação em ASP.NET Core.
- Para implementações completas de validador-componente e validação remota, consulte ASP.NET Core Blazor validação de formulário avançada.
- Para implementações completas de validador-componente e validação remota, consulte ASP.NET Core Blazor validação de formulário avançada.
Validar com anotações de dados
O modelo a seguir usa RequiredAttribute e RangeAttribute:
Starship.cs:
using System.ComponentModel.DataAnnotations;
public class Starship
{
[Required]
public string? Identifier { get; set; }
[Range(1, 10, ErrorMessage = "Accommodation must be between 1 and 10.")]
public int MaximumAccommodation { get; set; }
}
Adicione o modelo a um EditForm, inclua DataAnnotationsValidatore exiba erros com ValidationMessage<TValue> ou ValidationSummary. O OnValidSubmit callback é chamado somente quando a validação é bem-sucedida:
<EditForm Model="Model" OnValidSubmit="Submit">
<DataAnnotationsValidator />
<ValidationSummary />
<p>
<label>
Identifier:
<InputText @bind-Value="Model.Identifier" />
</label>
<ValidationMessage For="() => Model.Identifier" />
</p>
<p>
<label>
Maximum accommodation:
<InputNumber @bind-Value="Model.MaximumAccommodation" />
</label>
<ValidationMessage For="() => Model.MaximumAccommodation" />
</p>
<button type="submit">Submit</button>
</EditForm>
@code {
private Starship Model { get; } = new Starship();
private void Submit()
{
// Process the valid form.
}
}
Para um envio de formulário SSR estático, atribua um FormName exclusivo e receba o modelo enviado com [SupplyParameterFromForm]:
<EditForm Model="Model" FormName="starship" OnValidSubmit="Submit">
...
</EditForm>
@code {
[SupplyParameterFromForm]
private Starship? Model { get; set; }
protected override void OnInitialized() => Model ??= new();
}
Para obter mais informações sobre envio de formulário e associação de modelo entre modos de renderização, consulte ASP.NET Core Blazor visão geral dos formulários e ASP.NET Core Blazor associação de formulários.
Sem um DataAnnotationsValidator componente, os atributos de validação no modelo não participam da validação do formulário.
Quando a validação é executada
Blazor realiza validação de campo e validação completa do formulário:
- A validação de campo é executada após uma alteração de campo. Em um formulário interativo, isso ocorre em .NET enquanto o usuário edita o formulário.
- A validação de forma completa normalmente é executada quando
EditFormmanipula o envio por meioOnValidSubmitouOnInvalidSubmit. UmOnSubmitmanipulador assume o controle da validação, conforme descrito no envio de formulário de controle.
Um formulário SSR estático pode fornecer feedback imediato no navegador com a validação de formulário no lado do cliente do ASP.NET Core Blazor em SSR estático. O formulário é validado novamente com autorização no servidor quando postado.
Um formulário SSR estático é validado no servidor quando postado e não fornece validação de campo dinâmico entre solicitações.
Os resultados de validação que identificam um membro estão associados a esse campo. Os resultados sem um nome de membro são associados ao modelo e aparecem em um resumo de validação, em vez de no componente ValidationMessage de um campo.
Configurar validação de anotações de dados
DataAnnotationsValidator sempre habilita a validação do DataAnnotations para o formulário. Para usar os recursos de validação estendida fornecidos pelo Microsoft.Extensions.Validation pacote, chame o AddValidation método de extensão no Program arquivo:
builder.Services.AddValidation();
A AddValidation chamada registra os serviços de validação do pacote e ativa um gerador de origem que cria metadados de validação para tipos de modelo descobertos. O comportamento disponível depende se esses metadados incluem o modelo do formulário:
| Configuração | Behavior |
|---|---|
| Metadados gerados estão disponíveis | Valida objetos aninhados e coleções e dá suporte à localização de mensagens. |
| Metadados gerados não estão disponíveis | Valida propriedades de nível superior, mas não valida objetos aninhados ou coleções e não usa o Microsoft.Extensions.Validation pipeline de localização de mensagens. |
| Configuração | Behavior |
|---|---|
| Metadados gerados estão disponíveis | Valida objetos e coleções aninhados. |
| Metadados gerados não estão disponíveis | Valida somente propriedades de nível superior. |
As APIs ValidatableTypeAttribute e SkipValidationAttribute são experimentais em .NET 10. Para obter detalhes e soluções alternativas disponíveis, consulte Validação no ASP.NET Core.
Ao usar Microsoft.Extensions.Validation, declare tipos de modelo em arquivos C# (.cs) em vez de Razor arquivos de componente (.razor). O gerador de código-fonte cria metadados de validação a partir do código-fonte C# e não pode incluir tipos de modelo declarados em componentes Razor.
Para requisitos de configuração, ordem de validação, regras personalizadas, grafos de objeto aninhados e metadados gerados, consulte Validação em ASP.NET Core.
Validar grafo de objetos aninhados
No .NET 9 ou em versões anteriores, DataAnnotationsValidator valida as propriedades de nível superior do modelo, mas não valida recursivamente propriedades de coleções ou de tipos complexos. Para validação recursiva, use ObjectGraphDataAnnotationsValidator e [ValidateComplexType] do pacote experimentalMicrosoft.AspNetCore.Components.DataAnnotations.Validation:
<EditForm Model="Model" OnValidSubmit="Submit">
<ObjectGraphDataAnnotationsValidator />
...
</EditForm>
public class Starship
{
[ValidateComplexType]
public ShipDescription Description { get; set; } =
new ShipDescription();
}
O pacote permanece experimental nessas versões da estrutura.
Atributo [CompareProperty]
Para .NET 5 ou anterior, use o pacote ComparePropertyAttribute experimental em vez de CompareAttribute.
ComparePropertyAttribute associa o resultado da validação ao campo de forma consistente durante a validação de campo e a validação completa do formulário.
Escrever regras personalizadas baseadas em modelo
Quando os atributos integrados não forem suficientes para expressar uma regra, use um atributo personalizado ValidationAttribute ou IValidatableObject. Para obter diretrizes detalhadas, consulte Validação em ASP.NET Core.
Escrever regras personalizadas baseadas em modelo
Quando os atributos internos não puderem expressar uma regra, use um atributo de validação personalizado ou implemente IValidatableObject. Ambos são executados por DataAnnotationsValidator.
Ao retornar um ValidationResult de um atributo personalizado, inclua o nome do membro validado para que o resultado possa aparecer no componente ValidationMessage desse campo.
Atributos personalizados podem resolver serviços registrados por meio de GetService.
Adicionar validação por meio EditContext
EditForm cria um EditContext automaticamente quando seu Model parâmetro é atribuído. Para usar as APIs de validação diretamente, crie você mesmo o contexto e atribua-o ao parâmetro EditContext de EditForm. Não atribua ambos Model e EditContext ao mesmo formulário.
A validação personalizada geralmente usa:
- OnValidationRequested para validação completa do formulário.
- OnFieldChanged para validação de campo.
- ValidationMessageStore para adicionar e limpar mensagens.
- NotifyValidationStateChanged para notificar a interface após as mensagens serem alteradas.
O seguinte padrão de formulário interativo adiciona uma regra de negócios no nível de formulário juntamente com a validação de anotações de dados e verifica novamente a regra quando qualquer um dos campos relevantes é alterado:
@implements IDisposable
<EditForm EditContext="editContext" OnValidSubmit="Submit">
<DataAnnotationsValidator />
<ValidationSummary />
...
</EditForm>
@code {
private Starship Model { get; } = new Starship();
private EditContext editContext = default!;
private ValidationMessageStore messages = default!;
protected override void OnInitialized()
{
editContext = new EditContext(Model);
messages = new ValidationMessageStore(editContext);
editContext.OnValidationRequested += ValidateBusinessRules;
editContext.OnFieldChanged += ValidateChangedField;
}
private void ValidateBusinessRules(
object? sender, ValidationRequestedEventArgs e)
{
messages.Clear();
ValidateIdentifier();
editContext.NotifyValidationStateChanged();
}
private void ValidateChangedField(
object? sender, FieldChangedEventArgs e)
{
if (e.FieldIdentifier.FieldName != nameof(Starship.Identifier) &&
e.FieldIdentifier.FieldName != nameof(Starship.MaximumAccommodation))
{
return;
}
messages.Clear(
editContext.Field(nameof(Starship.Identifier)));
ValidateIdentifier();
editContext.NotifyValidationStateChanged();
}
private void ValidateIdentifier()
{
if (Model.MaximumAccommodation == 1 &&
string.IsNullOrWhiteSpace(Model.Identifier))
{
messages.Add(
editContext.Field(nameof(Starship.Identifier)),
"An identifier is required for a single-occupant ship.");
}
}
private void Submit()
{
// Process the valid form.
}
public void Dispose()
{
editContext.OnValidationRequested -= ValidateBusinessRules;
editContext.OnFieldChanged -= ValidateChangedField;
}
}
Um OnFieldChanged handler recebe o campo alterado em e.FieldIdentifier. Limpe ou substitua as mensagens afetadas e ligue para NotifyValidationStateChanged, como demonstra o exemplo anterior.
O SSR estático não fornece validação dinâmica de campo .NET entre solicitações.
Para validação assíncrona do formulário completo, chame e.AddAsyncValidator em um manipulador OnValidationRequested. Para validação assíncrona de campo em um formulário interativo, chame EditContext.RegisterAsyncFieldValidator em um manipulador OnFieldChanged. Uma nova validação assíncrona para o mesmo campo substitui e cancela a anterior.
Para atributos de validação assíncrona baseados em modelo, consulte Validação em ASP.NET Core. Para obter um componente de validador reutilizável completo, consulte ASP.NET Core Blazor validação de formulário avançada.
Para obter uma implementação reutilizável que encapsula assinaturas de eventos e seu repositório de mensagens, consulte ASP.NET Core Blazor validação de formulário avançada.
Exibir mensagens de validação
Use ValidationMessage<TValue> para exibir mensagens associadas a um campo:
<ValidationMessage For="() => Model.Identifier" />
A For expressão identifica o campo por sua instância de modelo e propriedade.
Blazor representa essa identidade com um FieldIdentifier, portanto, as propriedades com o mesmo nome em instâncias de modelo diferentes são tratadas como campos diferentes. Usar uma expressão em vez de uma cadeia de caracteres também permite que as ferramentas de refatoração atualizem a referência de propriedade.
Use ValidationSummary para exibir mensagens para o formulário:
<ValidationSummary />
Atribua o parâmetro do Model resumo para restringi-lo a mensagens associadas a um modelo específico:
<ValidationSummary Model="Model" />
Para inspecionar as mensagens atuais no código, chame GetValidationMessages:
var allMessages = editContext.GetValidationMessages();
var fieldMessages = editContext.GetValidationMessages(
editContext.Field(nameof(Starship.Identifier)));
Esses métodos leem o estado de validação atual. Eles não iniciam a validação.
Personalizar a aparência da validação
Blazor aplica classes CSS que representam o estado do campo e da mensagem:
| Elemento | Aulas |
|---|---|
| Entrada |
valid ou invalid, mais modified depois que o usuário edita o campo |
| Mensagem de validação | validation-message |
| Resumo da validação |
validation-summary-errors ou validation-summary-valid |
Entradas com validação de campo assíncrono usam pending ou faulted, opcionalmente, com modified, em vez de valid ou invalid enquanto o estado correspondente se aplica.
Os Blazor modelos de projeto incluem estilos para as classes válidas e inválidas comuns. Adicione estilos para outras classes conforme necessário.
ValidationMessage e ValidationSummary também aceitam atributos HTML arbitrários. Fornecer um class atributo substitui a classe padrão do componente.
Para alterar as classes aplicadas aos componentes de entrada, derive de FieldCssClassProvider.
using Microsoft.AspNetCore.Components.Forms;
public sealed class BootstrapFieldCssClassProvider : FieldCssClassProvider
{
public override string GetFieldCssClass(
EditContext editContext,
in FieldIdentifier fieldIdentifier)
{
if (!editContext.IsModified(fieldIdentifier))
{
return string.Empty;
}
return editContext.IsValid(fieldIdentifier)
? "is-valid"
: "is-invalid";
}
}
using System.Linq;
using Microsoft.AspNetCore.Components.Forms;
public sealed class BootstrapFieldCssClassProvider : FieldCssClassProvider
{
public override string GetFieldCssClass(
EditContext editContext,
in FieldIdentifier fieldIdentifier)
{
if (!editContext.IsModified(fieldIdentifier))
{
return string.Empty;
}
return editContext.GetValidationMessages(fieldIdentifier).Any()
? "is-invalid"
: "is-valid";
}
}
Um FieldCssClassProvider personalizado determina o valor completo da classe para cada campo. Se o formulário usar validação de campo assíncrono, manipule IsValidationPending(fieldIdentifier) e IsValidationFaulted(fieldIdentifier) no provedor quando forem necessárias classes pendentes ou com falha.
Atribua o provedor ao EditContext do formulário:
editContext.SetFieldCssClassProvider(
new BootstrapFieldCssClassProvider());
Para marcação de entrada personalizada, chame FieldCssClass para obter a classe selecionada pelo provedor atual.
Quando um modelo é atribuído a um EditForm, seu conteúdo filho recebe o EditContext gerado. Capture o contexto por meio do Context parâmetro e chame FieldCssClass para aplicar as classes do campo à marcação ao redor:
<EditForm Model="Model" Context="editContext">
<DataAnnotationsValidator />
<div class="@editContext.FieldCssClass(
() => Model.Identifier)">
<InputText @bind-Value="Model.Identifier" />
<ValidationMessage For="() => Model.Identifier" />
</div>
</EditForm>
Responder ao estado de validação
EditContext expõe o estado de validação atual sem iniciar a validação.
- Use
IsModified(field)ouIsModified()determine se um campo ou qualquer campo no formulário foi alterado. - Use
GetValidationMessages(field)ouGetValidationMessages()para inspecionar as mensagens do campo atual ou do formulário.
Use IsValid(field) para determinar se um campo atualmente tem mensagens de validação.
Para um campo, a ausência de mensagens pode ser verificada com !editContext.GetValidationMessages(field).Any().
O exemplo a seguir exibe a interface do usuário personalizada somente depois que um campo é modificado e inválido:
@{
var identifier = editContext.Field(nameof(Starship.Identifier));
}
@if (editContext.IsModified(identifier) &&
!editContext.IsValid(identifier))
{
<p>Correct the identifier before continuing.</p>
}
@{
var identifier = editContext.Field(nameof(Starship.Identifier));
}
@if (editContext.IsModified(identifier) &&
editContext.GetValidationMessages(identifier).Any())
{
<p>Correct the identifier before continuing.</p>
}
Os componentes de entrada, ValidationMessage e ValidationSummary, se atualizam quando o estado de validação muda. Um componente que renderiza outras interfaces de usuário de validação condicional deve se inscrever em OnValidationStateChanged e chamar StateHasChanged:
private void HandleValidationStateChanged(
object? sender, ValidationStateChangedEventArgs e) =>
_ = InvokeAsync(StateHasChanged);
Cancele a assinatura de OnValidationStateChanged quando o componente for descartado.
Use IsValidationPending(field) e IsValidationFaulted(field) para validação de campo assíncrono. Os métodos sem parâmetro descrevem passagens no nível ValidateAsync do formulário e não agregam o estado de cada campo.
Esses estados também incluem trabalho assíncrono executado por DataAnnotationsValidator. Um AsyncValidationAttribute aplicado a uma propriedade usa o estado do campo durante a validação de campo, incluindo as classes padrão pending e faulted CSS. Durante ValidateAsync, atributos assíncronos e IAsyncValidatableObject contribuem para o estado de nível de formulário relatado pelos métodos sem parâmetros.
Indicadores pendentes dinâmicos exigem um modo de renderização interativo. Durante uma postagem de formulário SSR estático, a validação do lado do servidor é concluída antes que a resposta seja renderizada.
Envio de formulário de controle
EditForm fornece três callbacks de envio:
| Callback | Behavior |
|---|---|
| OnValidSubmit | É executado após a validação automática ser bem-sucedida. |
| OnInvalidSubmit | É executado após falha na validação automática. |
| OnSubmit | Fornece ao manipulador o controle de validação e envio. |
OnValidSubmit e OnInvalidSubmit podem ser usados juntos. Não combine OnSubmit com nenhum deles.
EditForm usa ValidateAsync antes de invocar OnValidSubmit ou OnInvalidSubmit e, assim, aguarda validadores síncronos e assíncronos. Ao manipular OnSubmit, chame ValidateAsync antes de processar o formulário:
<EditForm EditContext="editContext" OnSubmit="HandleSubmit">
...
</EditForm>
@code {
private async Task HandleSubmit(EditContext editContext)
{
if (await editContext.ValidateAsync())
{
await SaveAsync();
}
}
}
O método síncrono Validate é obsoleto no .NET 11. Não aguarda a validação assíncrona e lança uma exceção se um manipulador tentar registrar trabalho assíncrono.
Para formulários interativos, o estado pendente no nível do formulário pode ser usado para desabilitar o envio enquanto ValidateAsync estiver em execução:
<button type="submit" disabled="@editContext.IsValidationPending()">
Save
</button>
Ao manipular OnSubmit, chame Validate antes de processar o formulário:
<EditForm EditContext="editContext" OnSubmit="HandleSubmit">
...
</EditForm>
@code {
private void HandleSubmit(EditContext editContext)
{
if (editContext.Validate())
{
Save();
}
}
}