Vedeți funcționează asp-validation-summary

Pagina actualizată :
Data creării paginii :

Mediu

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

La început

ASP.NET Există o modalitate de a utiliza asp-validare-rezumat ca o modalitate de a afișa erorile de validare de intrare pe ecran în Core. Nu am înțeles cu adevărat diferența dintre parametrii pe care am putut specifica, așa că am verificat-o.

Există trei valori posibile:

  • Nici unul
  • ModelNumai
  • Toate

Ca urmare a examinării modului în care funcționează fiecare dintre aceste diferențe, rezultatul este după urmează:

Pre-pregătire

Pentru moment, ne vom pregăti pentru operație. Cele mai multe dintre ele sunt redundante, deci, dacă doriți doar pentru a vedea rezultatele, a se vedea a doua jumătate a articolului.

Această validare presupune că doriți să înregistrați utilizatorul în formular, astfel încât vom crea un model de vizualizare pentru utilizator. Am pus diverse elemente, dar conținutul nu contează nimic, deoarece este posibil să se verifice dacă există cel puțin unul. Vom verifica cu DataAnnotation, așa că vom seta atributele Necesare și StringLength. Pentru a vedea diferența de comportament, am pus doar într-un plus IsAccepted.

** Modele/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; }
  }
}

Pentru a examina cele trei valori ale asp-validation-summary, creați fiecare acțiune. Cu toate acestea, deoarece asp-validare-rezumat este o poveste parte vizualizare, conținutul fiecărei acțiuni sunt toate același cod, cu excepția pentru mesaje.

Dacă IsAccepted nu este bifat, adăugăm o eroare. Eroarea este adăugată la eroare cu o cheie diferită de model și o cheie goală.

Dacă nu există erori, afișați un mesaj de înregistrare reușit.

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 adaugă un link la pagina în care se face fiecare test.

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>

Aceasta este pagina de înregistrare a utilizatorului pentru verificare. Dacă există o eroare, specificați Nici unul pentru asp-validare-rezumat ca un parametru pentru a afișa conținutul său. De asemenea, am pus "Eroare directă intrare" teză în tag-ul div pentru a vedea dacă mesajul de eroare implicit este afișat.

Alt cod nu este discutat în detaliu, deoarece este codul care a fost generat automat de schele bazate pe model. (Unele dintre ele au fost fixate manual, dar nu are nimic de-a face cu această verificare.)

Există o etichetă span cu atributul asp-validation-for setat lângă fiecare câmp de intrare (etichetă de intrare). Aceasta este o etichetă (atribut) pentru afișarea mesajelor de eroare pentru fiecare câmp de intrare. Indiferent de parametrul specificat în asp-validation-summary, un mesaj de eroare este întotdeauna afișat în acea locație dacă există o eroare.

De asemenea, asp-validare-rezumat afișează rezultatele verificării serverului, astfel încât procesul de validare client (_ValidationScriptsPartial) comentarii afară.

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

ValidateModelOnly.cshtml pagini sunt doar cu excepția cazului în care specificați ModelOnly pentru asp-validare-rezumat. Textul afișat este același cu ValidateNone.cshtml care trage cu ochiul.

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

@* 省略 *@

ValidateAll.cshtml pagini sunt aproape identice, cu excepția pentru specificarea Toate pentru asp-validare-rezumat.

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

@* 省略 *@

Verificați operațiunea

Nici unul

După ce creați programul, încercați să verificați operația. asp-validare-rezumat=Niciun ecran.

Deoarece "Eroare directă de intrare" este afișat în starea inițială de afișare, nu pare a fi capabil să fie utilizat ca un mesaj de eroare implicit. Există parametri care au fost setați la Obligatoriu, așa că haideți să continuăm să efectuăm procesul de actualizare.

Ca nume de Nici unul, nimic nu se afișează dacă există o eroare. Mesajul de eroare implicit rămâne intact, astfel încât este puțin probabil să setați Nici unul direct și să-l utilizați. Dacă aveți o șansă de a-l utiliza, doriți să setați dinamic valoarea la asp-validare-rezumat și niciuna dacă nu doriți să vedeți o eroare?

ModelNumai

Asp-validare-rezumat = Ecranul cuModelOnly. Cred că există o mulțime de scene de utilizare cele mai multe, deoarece iese în eșantion de eroare de verificare și schele.

Deoarece textul de "Eroare de intrare directă", care a fost plasat în tag-ul div nu este afișat, se pare că nu există nici o problemă, chiar dacă ați pus-o.

Este o stare în care se efectuează procesul de înregistrare și se afișează eroarea. Singurele mesaje afișate aici sunt mesajele implicite care au fost plasate anterior în eticheta div și mesajele de eroare care au avut loc pe partea de server. Rețineți, totuși, că, dacă nu aveți un mesaj cheie gol pe partea de server, mesajul din tag-ul div nu va apărea.

Pe partea de server, sunt puse două mesaje de eroare, dar se afișează numai eroarea cu caractere goale din cheie. Dacă specificați o cheie, aceasta va fi tratată ca o eroare în proprietatea modelului cu acel nume, deci nu apare în asp-validation-summary. În schimb, un mesaj apare la orice etichetă cu atributul asp-validation-for cu același nume.

Toate

Asp-validation-summary=Toate sunt specificate pe ecran.

Din anumite motive, se afișează textul "intrării directe de eroare" încorporate. Nu sunt sigur de ce nu văd ModelOnly singur. Se pare că încorporarea nu poate fi folosită în Toate pentru moment.

Este un ecran după ce procesul de actualizare se efectuează așa este. Mesajele de eroare pentru toate câmpurile de intrare (proprietățile) sunt afișate într-o listă. Fiecare câmp de intrare afișează, de asemenea, un mesaj de eroare, deci dacă doriți să specificați Toate pentru a rezuma eroarea, Ar fi mai bine să eliminați setul de atribute asp-validation-for pentru fiecare câmp de intrare.

Mesajele de eroare adăugate pe partea de server sunt, de asemenea, afișate. De asemenea, puteți vedea că vizualizați și o eroare cu cheia.

Rezumat

Asp-validare-rezumat a avut trei parametri. Este posibil să doriți să utilizați ModelOnly pentru a face mai ușor de înțeles unde este eroarea sau pentru a elimina duplicarea. Rețineți că singurul mesaj afișat în asp-validare-rezumat este un mesaj cu o cheie goală.

Apropo, puteți adăuga oricâte mesaje doriți la o cheie goală, astfel încât să nu trebuiască să combinați șiruri pentru a afișa mai multe mesaje.

Pentru toți, dacă doriți să colectați mesaje de eroare într-un singur loc, Pentru Nici unul, setați dinamic atunci când nu doriți să apară un mesaj de eroare pentru orice motiv. Este bine să-l folosească în scopul de a.