Veja como funciona o resumo de validação asp

Página atualizada :
Data de criação de página :

Ambiente

Estúdio Visual
  • Visual Studio 2019
Núcleo ASP.NET
  • 3.0
  • 3.1

No começo

ASP.NET Há uma maneira de usar o resumo de validação asp como forma de exibir erros de validação de entrada na tela no Core. Eu realmente não entendi a diferença entre os parâmetros que eu poderia especificar, então eu verifiquei.

Existem três valores possíveis:

  • Nenhum
  • ModeloOnly
  • Todos

Como resultado de examinar como cada uma dessas diferenças funciona, o resultado é o seguinte:

Pré-preparação

Por enquanto, nos prepararemos para a operação. A maioria deles é redundante, então se você só quer ver os resultados, veja a segunda metade do artigo.

Esta validação pressupõe que você deseja registrar o usuário no formulário, por isso criaremos um modelo de exibição para o usuário. Coloquei vários itens, mas o conteúdo não importa nada porque é possível verificar se há pelo menos um. Vamos verificar com DataAnnotation, então vamos definir os atributos Required e StringLength. Para ver a diferença de comportamento, eu só coloquei um isaccepted extra.

** Modelos/UserViewModel **

using System;
using System.ComponentModel.DataAnnotations;

namespace ValidationSummaryTest.Models
{
  public class UserViewModel
  {
    [Required]
    [StringLength(20)]
    public string ID { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    // 省略

    [Required]
    public bool IsAccepted { get; set; }
  }
}

Para examinar os três valores do resumo de validação asp, crie cada ação. No entanto, uma vez que o resumo de validação asp é uma história de lado de exibição, o conteúdo de cada ação é todo o mesmo código, exceto para mensagens.

Se o IsAccepted não for verificado, adicionaremos um erro. O erro é adicionado ao erro com uma tecla diferente do modelo e uma chave vazia.

Se não houver erros, exiba uma mensagem de registro bem sucedida.

HomeController.cs

public IActionResult ValidateNone() => View();

[HttpPost]
public IActionResult ValidateNone(UserViewModel model)
{
  if (model.IsAccepted == false)
  {
    ModelState.AddModelError("PropertyName1", "プロパティに依存するエラー (None)");
    ModelState.AddModelError("", "空のキーエラー (None)");
  }
  if (ModelState.IsValid == false) return View(model);
  ViewData["Message"] = "正常に登録しました。";
  return View(model);
}

public IActionResult ValidateModelOnly() => View();

[HttpPost]
public IActionResult ValidateModelOnly(UserViewModel model)
{
  if (model.IsAccepted == false)
  {
    ModelState.AddModelError("PropertyName1", "プロパティに依存するエラー (ModelOnly)");
    ModelState.AddModelError("", "空のキーエラー (ModelOnly)");
  }
  if (ModelState.IsValid == false) return View(model);
  ViewData["Message"] = "正常に登録しました。";
  return View(model);
}

public IActionResult ValidateAll() => View();

[HttpPost]
public IActionResult ValidateAll(UserViewModel model)
{
  if (model.IsAccepted == false)
  {
    ModelState.AddModelError("PropertyName1", "プロパティに依存するエラー (All)");
    ModelState.AddModelError("", "空のキーエラー (All)");
  }
  if (ModelState.IsValid == false) return View(model);
  ViewData["Message"] = "正常に登録しました。";
  return View(model);
}

Index.cshtml adiciona um link à página onde cada teste é feito.

index.cshtml

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
  <h1 class="display-4">Welcome</h1>
  <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<ul>
  <li><a asp-action="ValidateNone">ValidateNone</a></li>
  <li><a asp-action="ValidateModelOnly">ValidateModelOnly</a></li>
  <li><a asp-action="ValidateAll">ValidateAll</a></li>
</ul>

Esta é a página de registro do usuário para verificação. Se houver um erro, especifique Nenhum para resumo de validação asp como parâmetro para exibir seu conteúdo. Também colocamos a frase "Entrada direta de erro" na tag div para ver se a mensagem de erro padrão é exibida.

Outro código não é discutido em detalhes porque é o código que foi gerado automaticamente por andaimes com base no modelo. (Alguns deles foram corrigidos à mão, mas não tem nada a ver com essa verificação.)

Há uma tag de extensão com o conjunto de atributos asp-validação para para perto de cada campo de entrada (tag de entrada). Esta é uma tag (atributo) para exibir mensagens de erro para cada campo de entrada. Independentemente do parâmetro especificado no resumo de validação asp, uma mensagem de erro é sempre exibida naquele local se houver um erro.

Além disso, o resumo de validação asp exibe os resultados de verificação do servidor, de modo que o processo de validação do cliente (_ValidationScriptsPartial) é de comentários.

ValidarNone.cshtml

@model ValidationSummaryTest.Models.UserViewModel

@{
  ViewData["Title"] = "ValidateNone";
}

<h1>ValidateNone</h1>

<h4>UserViewModel</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="ValidateNone">
    
      <div asp-validation-summary="None" class="text-danger">エラー直接入力</div>
      
      <div class="form-group">
        <label asp-for="ID" class="control-label"></label>
        <input asp-for="ID" class="form-control" />
        <span asp-validation-for="ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
      </div>
      
      @* 省略 *@
      
      <div class="form-group form-check">
        <label class="form-check-label">
          <input class="form-check-input" asp-for="IsAccepted" /> @Html.DisplayNameFor(model => model.IsAccepted)
        </label>
      </div>
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
  <a asp-action="Index">Back to List</a>
</div>

@* サーバーのエラーを表示したいのでコメントアウト *@
@*@section Scripts {
  @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}*@

ValidarModelOnly.cshtml páginas são apenas a menos que você especifique ModelOnly para resumo de validação asp. O texto do display é o mesmo que validateNone.cshtml espiando.

ValideModelOnly.cshtml

@model ValidationSummaryTest.Models.UserViewModel

@{
  ViewData["Title"] = "ValidateModelOnly";
}

<h1>ValidateModelOnly</h1>

<h4>UserViewModel</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="ValidateModelOnly">
      <div asp-validation-summary="ModelOnly" class="text-danger">エラー直接入力</div>
      
      @* 省略 *@

    </form>
  </div>
</div>

@* 省略 *@

ValidarAs páginas de 2000 são quase idênticas, exceto por especificar All para resumo de validação de asp.

ValidarAll.cshtml

@model ValidationSummaryTest.Models.UserViewModel

@{
  ViewData["Title"] = "ValidateAll";
}

<h1>ValidateAll</h1>

<h4>UserViewModel</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="ValidateAll">
      <div asp-validation-summary="All" class="text-danger">エラー直接入力</div>
    </form>

    @* 省略 *@
  </div>
</div>

@* 省略 *@

Confira a operação

Nenhum

Depois de criar o programa, tente verificar a operação. asp-validação-resumo=Nenhuma tela.

Uma vez que "Entrada direta de erro" é exibido no estado de exibição inicial, ele não parece ser capaz de ser usado como uma mensagem de erro padrão. Existem parâmetros que foram definidos como Necessários, então vamos continuar a executar o processo de atualização.

Como o nome de None, nada é exibido se houver um erro. A mensagem de erro padrão permanece intacta, portanto é improvável uma chance de definir Nenhum diretamente e usá-la. Se você tiver a chance de usá-lo, deseja definir dinamicamente o valor para o resumo de validação asp e nenhum se você não quiser ver um erro?

ModeloOnly

Resumo de validação de asp= A tela comModelOnly. Eu acho que há muitas cenas de uso mais porque sai na amostra do erro de verificação e andaimes.

Uma vez que o texto de "Erro de entrada direta" que foi colocado na tag div não é exibido, parece que não há problema mesmo se você colocá-lo.

É um estado em que o processo de registro é realizado e o erro é exibido. As únicas mensagens exibidas aqui são as mensagens padrão que foram colocadas anteriormente na tag div e as mensagens de erro que ocorreram no lado do servidor. Observe, no entanto, que se você não tiver uma mensagem de chave vazia no lado do servidor, a mensagem na tag div não aparecerá.

No lado do servidor, duas mensagens de erro são colocadas, mas apenas o erro com caracteres vazios na tecla é exibido. Se você especificar uma chave, ela será tratada como um erro na propriedade do modelo com esse nome, para que não apareça no resumo asp-validação. Em vez disso, uma mensagem aparece em qualquer tag com o atributo asp-validation-for de mesmo nome.

Todos

Resumo de validação de asp=Tudo está especificado na tela.

Por alguma razão, o texto da "entrada direta de erro" incorporada é exibido. Não sei por que não vejo a ModelOnly sozinha. Parece que a incorporação não pode ser usada em All por enquanto.

É uma tela após o processo de atualização ser realizado como ele é. Mensagens de erro para todos os campos de entrada (propriedades) são exibidas em uma lista. Cada campo de entrada também exibe uma mensagem de erro, então se você quiser especificar Tudo para resumir o erro, Seria melhor remover o conjunto de atributos asp-validação para cada campo de entrada.

Mensagens de erro adicionadas no lado do servidor também são exibidas. Você também pode ver que você também está visualizando um erro com a chave.

Resumo

O resumo de validação de asp tinha três parâmetros. Você pode querer usar o ModelOnly para facilitar a compreensão de onde está o erro ou eliminar a duplicação. Observe que a única mensagem exibida no resumo de validação asp é uma mensagem com uma chave vazia.

A propósito, você pode adicionar quantas mensagens quiser para uma chave vazia, para que você não precise combinar strings para exibir várias mensagens.

Para todos, se você quiser coletar mensagens de erro em um só lugar, Para None, defina dinamicamente quando você não quiser que uma mensagem de erro apareça por qualquer motivo. É bom usá-lo com o propósito de.