Bekijk hoe asp-validatie-samenvatting werkt

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Milieu

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

In eerste instantie

ASP.NET Er is een manier om asp-validatie-samenvatting te gebruiken als een manier om invoervalidatiefouten op het scherm weer te geven in Core. Ik heb niet echt begrijpen het verschil tussen de parameters die ik kon specificeren, dus ik controleerde het.

Er zijn drie mogelijke waarden:

  • Geen
  • ModelAlleen
  • Alle

Als gevolg van het onderzoeken van hoe elk van deze verschillen werkt, is het resultaat als volgt:

Voorbereiding

Voorlopig bereiden we ons voor op de operatie. De meeste van hen zijn overbodig, dus als je alleen wilt de resultaten te zien, zie de tweede helft van het artikel.

Bij deze validatie wordt ervan uitgegaan dat u de gebruiker in het formulier wilt registreren, zodat we een weergavemodel voor de gebruiker maken. Ik zet verschillende items, maar de inhoud maakt niets uit, want het is mogelijk om te controleren of er ten minste een. We controleren met DataAnnotation, dus we stellen de vereiste en StringLength-kenmerken in. Om het verschil in gedrag te zien, heb ik er een extra IsAccepted in gedaan.

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

Als u de drie waarden van asp-validatie-samenvatting wilt onderzoeken, maakt u elke actie. Aangezien asp-validatie-samenvatting echter een verhaal is over de weergavezijde, is de inhoud van elke actie allemaal dezelfde code, behalve voor berichten.

Als IsAccepted niet is gecontroleerd, voegen we een fout toe. De fout wordt toegevoegd aan de fout met een andere sleutel dan het model en een lege sleutel.

Als er geen fouten zijn, geeft u een succesvol registratiebericht weer.

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 voegt een link toe aan de pagina waar elke test wordt uitgevoerd.

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>

Dit is de gebruikersregistratiepagina ter verificatie. Als er een fout optreedt, geeft u Geen op voor asp-validatie-overzicht als parameter om de inhoud weer te geven. We hebben ook de zin 'Fout direct entry' in de div-tag geplaatst om te zien of het standaardfoutbericht wordt weergegeven.

Andere code wordt niet in detail besproken omdat het de code is die automatisch werd gegenereerd door steigers op basis van het model. (Sommige van hen zijn met de hand vastgesteld, maar het heeft niets te maken met deze verificatie.)

Er is een spantag met de asp-validatie-voor-kenmerkset in de buurt van elk invoerveld (invoertag). Dit is een tag (kenmerk) voor het weergeven van foutberichten voor elk invoerveld. Ongeacht de parameter die is opgegeven in asp-validatie-overzicht, wordt er altijd een foutbericht weergegeven op die locatie als er een fout optreedt.

Ook geeft asp-validatie-samenvatting de resultaten van de serververificatie weer, zodat het clientvalidatieproces (_ValidationScriptsPartial) opmerkingen maakt.

ValiderenNone.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-pagina's zijn alleen, tenzij u ModelOnly opgeeft voor asp-validatie-overzicht. De weergavetekst is hetzelfde als ValidateNone.cshtml gluren.

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>

@* 省略 *@

ValidateAll.cshtml pagina's zijn vrijwel identiek, behalve voor het opgeven van All for 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>

@* 省略 *@

De bewerking controleren

Geen

Nadat u het programma hebt gemaakt, probeert u de bewerking te controleren. asp-validatie-samenvatting=Geen scherm.

Aangezien 'Fout directe invoer' wordt weergegeven in de oorspronkelijke weergavestatus, lijkt deze niet te kunnen worden gebruikt als standaardfoutbericht. Er zijn parameters die zijn ingesteld op Vereist, dus laten we doorgaan met het uitvoeren van het updateproces.

Als de naam van Geen wordt er niets weergegeven als er een fout optreedt. Het standaardfoutbericht blijft intact, dus er is onwaarschijnlijk een kans om Geen direct in te stellen en te gebruiken. Als u de kans hebt om het te gebruiken, wilt u de waarde dynamisch instellen op asp-validatie-samenvatting en geen als u geen fout wilt zien?

ModelAlleen

Asp-validatie-samenvatting= Het scherm metModelOnly. Ik denk dat er veel gebruik scènes het meest omdat het komt uit in de steekproef van de verificatie fout en steigers.

Aangezien de tekst van "Fout directe invoer" die werd geplaatst in de div-tag niet wordt weergegeven, lijkt het erop dat er geen probleem is, zelfs als je het.

Het is een status waarin het registratieproces wordt uitgevoerd en de fout wordt weergegeven. De enige berichten die hier worden weergegeven zijn de standaardberichten die eerder in de div-tag zijn geplaatst en de foutberichten die zich aan de serverzijde hebben voorgedaan. Houd er echter rekening mee dat als u geen leeg sleutelbericht aan de serverkant hebt, het bericht in de div-tag niet wordt weergegeven.

Aan de serverzijde worden twee foutberichten geplaatst, maar alleen de fout met lege tekens in de toets wordt weergegeven. Als u een sleutel opgeeft, wordt deze behandeld als een fout in de eigenschap van het model met die naam, zodat deze niet wordt weergegeven in het asp-validatie-overzicht. In plaats daarvan wordt een bericht weergegeven op elke tag met het asp-validatie-voor-kenmerk met dezelfde naam.

Alle

Asp-validatie-samenvatting=Alles wordt opgegeven op het scherm.

Om de een of andere reden wordt de tekst van de ingesloten 'fout directe invoer' weergegeven. Ik weet niet zeker waarom ik niet modelalleen alleen te zien. Het lijkt erop dat inbedding niet kan worden gebruikt in All voor het moment.

Het is een scherm nadat het updateproces is uitgevoerd zoals het is. Foutberichten voor alle invoervelden (eigenschappen) worden weergegeven in een lijst. In elk invoerveld wordt ook een foutbericht weergegeven, dus als u Alles wilt opgeven om de fout samen te vatten, Het zou beter zijn om de asp-validatie-voor attribuut set voor elk invoerveld te verwijderen.

Foutberichten die aan de serverzijde zijn toegevoegd, worden ook weergegeven. U ook zien dat u ook een fout met de sleutel bekijkt.

Samenvatting

Asp-validatie-samenvatting had drie parameters. U ModelOnly gebruiken om het gemakkelijker te maken om te begrijpen waar de fout is, of om dubbel werk te elimineren. Houd er rekening mee dat het enige bericht dat wordt weergegeven in het asp-validatie-overzicht een bericht met een lege sleutel is.

Overigens kun je zoveel berichten toevoegen als je wilt aan een lege sleutel, zodat je geen tekenreeksen hoeft te combineren om meerdere berichten weer te geven.

Voor Alles, als u foutberichten op één plaats wilt verzamelen, Bij Geen instellen, stel u dynamisch in wanneer u niet wilt dat er om welke reden dan ook een foutbericht wordt weergegeven. Het is goed om het te gebruiken voor het doel van.