Se hur asp-valideringssammanfattning fungerar

Sidan uppdaterad :
Datum för skapande av sida :

Miljö

Visuell studio
  • Visual Studio 2019
ASP.NET kärna
  • 3.0
  • 3.1

Först

ASP.NET Det finns ett sätt att använda asp-validation-summary som ett sätt att visa indatavalideringsfel på skärmen i Core. Jag förstod inte riktigt skillnaden mellan de parametrar som jag kunde ange, så jag kollade den.

Det finns tre möjliga värden:

  • Ingen
  • ModellOnly
  • Alla

Som ett resultat av att undersöka hur var och en av dessa skillnader fungerar, är resultatet följande:

Förberedelse före utarbetandet

Tills dess förbereder vi oss för operationen. De flesta av dem är överflödiga, så om du bara vill se resultaten, se den andra halvan av artikeln.

Den här valideringen förutsätter att du vill registrera användaren i formuläret, så vi skapar en vymodell för användaren. Jag lägger olika objekt, men innehållet spelar ingen roll något eftersom det är möjligt att kontrollera om det finns minst en. Vi kontrollerar med DataAnnotation, så vi ställer in attributen Obligatorisk och StringLength. För att se skillnaden i beteende, satte jag bara i en extra IsAccepted.

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

Om du vill undersöka de tre värdena i asp-validation-summary skapar du varje åtgärd. Men eftersom asp-validation-summary är en vy sida historia, innehållet i varje åtgärd är alla samma kod utom för meddelanden.

Om IsAccepted inte kontrolleras lägger vi till ett fel. Felet läggs till i felet med en annan nyckel än modellen och en tom nyckel.

Om det inte finns några fel visar du ett meddelande om lyckad registrering.

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 lägger till en länk till sidan där varje test görs.

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>

Det här är sidan för användarregistrering för verifiering. Om det finns ett fel anger du Ingen för asp-validation-summary som en parameter för att visa dess innehåll. Vi lägger också meningen "Fel direkt post" i div-taggen för att se om standardfelmeddelandet visas.

Annan kod diskuteras inte i detalj eftersom det är koden som automatiskt genererades av byggnadsställningar baserat på modellen. (Några av dem har fastställts för hand, men det har ingenting att göra med denna kontroll.)

Det finns en span-tagg med asp-validation-for-attributet inställt nära varje indatafält (indatatagg). Det här är en tagg (attribut) för att visa felmeddelanden för varje indatafält. Oavsett den parameter som anges i asp-validation-summary visas alltid ett felmeddelande på den platsen om det finns ett fel.

Asp-validation-summary visar också serververifieringsresultaten, så att klientvalideringsprocessen (_ValidationScriptsPartial) kommenterar resultatet.

ValideraNone.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 sidor är bara om du inte anger ModelOnly för asp-validering-sammanfattning. Visningstexten är samma som ValidateNone.cshtml som kikar på.

ValideramodelOnly.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-sidor är nästan identiska förutom att ange Alla för asp-validation-summary.

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

@* 省略 *@

Kontrollera åtgärden

Ingen

När du har skapat programmet försöker du kontrollera åtgärden. asp-validering-sammanfattning=Ingen skärm.

Eftersom "Fel direkt indata" visas i det första visningsläget verkar det inte kunna användas som standardfelmeddelande. Det finns parametrar som har ställts in på Obligatoriskt, så låt oss fortsätta att utföra uppdateringsprocessen.

Som namnet på Ingen visas ingenting om det finns ett fel. Standardfelmeddelandet förblir intakt, så det är osannolikt att det finns en chans att ställa in Ingen direkt och använda det. Om du har en chans att använda den, vill du dynamiskt ställa in värdet till asp-validering-sammanfattning och ingen om du inte vill se ett fel?

ModellOnly

Asp-validation-summary= Skärmen medModelOnly. Jag tror att det finns en hel del användning scener mest eftersom det kommer ut i urvalet av kontroll fel och byggnadsställningar.

Eftersom texten i "Fel direkt indata" som placerades i div-taggen inte visas, verkar det som om det inte är några problem även om du lägger den.

Det är ett tillstånd där registreringsprocessen utförs och felet visas. De enda meddelanden som visas här är standardmeddelanden som tidigare placerats i div-taggen och de felmeddelanden som inträffade på serversidan. Observera dock att om du inte har ett tomt nyckelmeddelande på serversidan visas inte meddelandet i div-taggen.

På serversidan visas två felmeddelanden, men bara felet med tomma tecken i nyckeln visas. Om du anger en nyckel behandlas den som ett fel i modellens egenskap med det namnet, så den visas inte i asp-validation-summary. I stället visas ett meddelande på valfri tagg med asp-validation-for-attributet med samma namn.

Alla

Asp-validation-summary=Alla anges på skärmen.

Av någon anledning visas texten i den inbäddade "fel direkt indata". Jag är inte säker på varför jag inte ser ModelOnly ensam. Det verkar som om inbäddning inte kan användas i alla för tillfället.

Det är en skärm efter att uppdateringsprocessen har utförts som den är. Felmeddelanden för alla inmatningsfält (egenskaper) visas i en lista. Varje inmatningsfält visar också ett felmeddelande, så om du vill ange Alla för att sammanfatta felet, Det är bättre att ta bort asp-validering-för-attributuppsättningen för varje indatafält.

Felmeddelanden som läggs till på serversidan visas också. Du kan också se att du också visar ett fel med nyckeln.

Sammanfattning

Asp-validering-sammanfattning hade tre parametrar. Du kanske vill använda ModelOnly för att göra det lättare att förstå var felet är, eller för att eliminera duplicering. Observera att det enda meddelandet som visas i asp-validation-summary är ett meddelande med en tom nyckel.

Förresten kan du lägga till så många meddelanden som du vill i en tom nyckel, så att du inte behöver kombinera strängar för att visa flera meddelanden.

Om du vill samla in felmeddelanden på ett ställe kan du för alla För Ingen anger du dynamiskt när du inte vill att ett felmeddelande ska visas av någon anledning. Det är bra att använda den för.