Scopri come funziona il riepilogo della convalida asp

Pagina aggiornata :
Data di creazione della pagina :

Ambiente

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 3.0
  • 3.1

In un primo momento

ASP.NET There is a way to use asp-validation-summary as a way to display input validation errors on the screen in Core. Non ho davvero capito la differenza tra i parametri che ho potuto specificare, così ho controllato.

Esistono tre valori possibili:

  • Nessuno
  • ModelSolo
  • Tutti

Come risultato dell'esame del funzionamento di ognuna di queste differenze, il risultato è il seguente:

Pre-preparazione

Per il momento, ci prepareremo per l'operazione. La maggior parte di loro sono ridondanti, quindi se si desidera solo vedere i risultati, vedere la seconda metà dell'articolo.

Questa convalida presuppone che si desidera registrare l'utente nel modulo, pertanto verrà creato un modello di visualizzazione per l'utente. Ho messo vari elementi, ma il contenuto non importa nulla perché è possibile verificare se c'è almeno uno. Verificheremo con DataAnnotation, quindi imposteremo gli attributi Required e StringLength. Per vedere la differenza di comportamento, ho appena messo in un extra IsAccepted.

Modelli/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; }
  }
}

Per esaminare i tre valori di asp-validation-summary, creare ogni azione. Tuttavia, poiché asp-validation-summary è una storia lato visualizzazione, il contenuto di ogni azione è lo stesso codice ad eccezione dei messaggi.

Se IsAccepted non è selezionato, viene aggiunto un errore. L'errore viene aggiunto all'errore con una chiave diversa rispetto al modello e una chiave vuota.

Se non sono presenti errori, visualizzare un messaggio di registrazione riuscito.

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 aggiunge un collegamento alla pagina in cui viene eseguito ogni test.

index.cshtml (informazioni in lingua inlingua in stato inci

@{
    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>

Questa è la pagina di registrazione dell'utente per la verifica. Se si verifica un errore, specificare None per asp-validation-summary come parametro per visualizzarne il contenuto. Abbiamo anche messo la frase "Errore diretto " nel tag div per vedere se viene visualizzato il messaggio di errore predefinito.

Altro codice non viene discusso in dettaglio perché è il codice generato automaticamente dallo scaffolding basato sul modello. (Alcuni di loro sono stati fissati a mano, ma non ha nulla a che fare con questa verifica.)

Esiste un tag span con l'attributo asp-validation-for impostato vicino a ogni campo di input (tag di input). Si tratta di un tag (attributo) per la visualizzazione dei messaggi di errore per ogni campo di input. Indipendentemente dal parametro specificato in asp-validation-summary, viene sempre visualizzato un messaggio di errore in tale posizione se si verifica un errore.

Inoltre, asp-validation-summary visualizza i risultati della verifica del server, in modo che il processo di convalida del client (_ValidationScriptsPartial) commenti out.

ValidateNone.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");}
}*@

Le pagine ValidateModelOnly.cshtml sono solo a meno che non si specifichi ModelOnly per asp-validation-summary. Il testo visualizzato è lo stesso di ValidateNone.cshtml visualizzazione.

ValidateModelOnly.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>

@* 省略 *@

Le pagine ValidateAll.cshtml sono quasi identiche, ad eccezione di specificare All per asp-validation-summary.

ValidateAll.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>

@* 省略 *@

Controllare l'operazione

Nessuno

Dopo aver creato il programma, provare a controllare l'operazione. asp-validation-summary: schermataNone.

Poiché "Errore input diretto" viene visualizzato nello stato di visualizzazione iniziale, non sembra essere in grado di essere utilizzato come messaggio di errore predefinito. Sono presenti parametri impostati su Obbligatorio, quindi continuiamo a eseguire il processo di aggiornamento.

Come nome di Nessuno, non viene visualizzato nulla se si verifica un errore. Il messaggio di errore predefinito rimane intatto, quindi è improbabile che ci sia la possibilità di impostare direttamente None e usarlo. Se si ha la possibilità di utilizzarlo, si desidera impostare dinamicamente il valore su asp-validation-summary e nessuno se non si desidera visualizzare un errore?

ModelSolo

Asp-validation-summary: schermata conModelOnly. Penso che ci sono un sacco di scene di uso più perché esce nel campione dell'errore di verifica e impalcature.

Dal momento che il testo di "Errore ingresso diretto" che è stato inserito nel tag div non viene visualizzato, sembra che non ci sia alcun problema anche se lo si mette.

Si tratta di uno stato in cui viene eseguito il processo di registrazione e viene visualizzato l'errore. Gli unici messaggi visualizzati qui sono i messaggi predefiniti che sono stati precedentemente inseriti nel tag div e i messaggi di errore che si sono verificati sul lato server. Si noti, tuttavia, che se non si dispone di un messaggio di chiave vuota sul lato server, il messaggio nel tag div non verrà visualizzato.

Sul lato server, vengono inseriti due messaggi di errore, ma viene visualizzato solo l'errore con caratteri vuoti nella chiave. Se si specifica una chiave, verrà considerata come un errore nella proprietà del modello con tale nome, in modo che non venga visualizzata nel riepilogo di convalida asp. Al contrario, viene visualizzato un messaggio in qualsiasi tag con l'attributo asp-validation-for con lo stesso nome.

Tutti

Asp-validation-summary: viene specificatotutto sullo schermo.

Per qualche motivo, viene visualizzato il testo dell'"input diretto errore" incorporato. Si è verificato un problema sconosciuto. Sembra che l'incorporamento non possa essere utilizzato in All per il momento.

Si tratta di una schermata dopo che il processo di aggiornamento viene eseguito così com'è. I messaggi di errore per tutti i campi di input (proprietà) vengono visualizzati in un elenco. Ogni campo di input visualizza anche un messaggio di errore, quindi se si desidera specificare All per riepilogare l'errore, Sarebbe preferibile rimuovere il set di attributi asp-validation-for per ogni campo di input.

Vengono visualizzati anche i messaggi di errore aggiunti sul lato server. Si può anche vedere che si sta visualizzando anche un errore con il tasto.

Riepilogo

Asp-validation-summary aveva tre parametri. È possibile utilizzare ModelOnly per semplificare la comprensione della posizione dell'errore o per eliminare la duplicazione. Si noti che l'unico messaggio visualizzato in asp-validation-summary è un messaggio con una chiave vuota.

A proposito, è possibile aggiungere tutti i messaggi che si desidera a una chiave vuota, in modo da non dover combinare le stringhe per visualizzare più messaggi.

Per tutti, se si desidera raccogliere i messaggi di errore in un'unica posizione, In Nessuno, impostare dinamicamente quando non si desidera visualizzare un messaggio di errore per qualsiasi motivo. E 'bene usarlo per lo scopo di.