Az asp-validation-summary működése

Oldal frissítve :
Oldal létrehozásának dátuma :

Környezet

Vizuális stúdió
  • Visual Studio 2019
ASP.NET Core
  • 3.0
  • 3.1

Először

ASP.NET Van egy módja annak, hogy az asp-validation-summary segítségével megjelenítheti a bemeneti érvényesítési hibákat a Core képernyőn. Nem igazán értettem a különbséget a paraméterek között, amelyeket meg tudtam adni, ezért ellenőriztem.

Három lehetséges érték létezik:

  • Nincs
  • ModelOnly
  • Minden

Az egyes különbségek működésének vizsgálata eredményeként az eredmény a következő:

Előelőkészítés

Egyelőre felkészülünk a műtétre. Legtöbbjük felesleges, így ha csak az eredményeket szeretné látni, tekintse meg a cikk második felét.

Ez az ellenőrzés feltételezi, hogy regisztrálni szeretné a felhasználót az űrlapon, ezért létrehozunk egy nézetmodellt a felhasználó számára. Tettem különböző elemeket, de a tartalom nem számít semmit, mert lehetséges, hogy ellenőrizze, ha van legalább egy. Ellenőrizzük a DataAnnotation, így beállítja a kötelező és StringLength attribútumok. Ahhoz, hogy a különbség a viselkedés, én csak tesz egy extra IsAccepted.

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

Az asp-validation-summary három értékének vizsgálatához hozzon létre minden műveletet. Mivel azonban az asp-validation-summary egy nézetoldal- szövegegység, az egyes műveletek tartalma az üzenetek kivételével ugyanaz a kód.

Ha az IsAccepted nincs bejelölve, akkor hibát adunk hozzá. A hiba a modelltől eltérő kulccsal és egy üres kulccsal egészül ki a hibához.

Ha nincsenek hibák, jelenítsen meg egy sikeres regisztrációs üzenetet.

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);
}

Az Index.cshtml egy hivatkozást ad hozzá ahhoz az oldalhoz, ahol az egyes teszteket elvégezték.

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>

Ez a felhasználó regisztrációs oldala az ellenőrzéshez. Ha hiba történt, adja meg a Nincs értéket az asp-validation-summary paraméterhez a tartalom megjelenítéséhez. Azt is fel a "Error Direct Entry" mondatot a div tag, hogy ha az alapértelmezett hibaüzenet jelenik meg.

Más kód nem tárgyalja részletesen, mert ez a kód, amely automatikusan generált állványzat alapján a modell. (Néhányat kézzel rögzítettek, de ennek semmi köze ehhez az ellenőrzéshez.)

Van egy span címke az asp-validation-for attribútum készlet közelében minden bemeneti mező (input tag). Ez egy címke (attribútum) az egyes beviteli adatokhoz megjelenő hibaüzenetek megjelenítéséhez. Az asp-validation-summaryban megadott paramétertől függetlenül hiba esetén mindig hibaüzenet jelenik meg az adott helyen.

Az asp-validation-summary is megjeleníti a kiszolgáló ellenőrzésének eredményeit, így az ügyfél-ellenőrzési folyamat (_ValidationScriptsPartial) megjegyzéseket fűz.

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

ValidateModelOnly.cshtml oldalak csak akkor, ha megadja ModelOnly asp-érvényesítés-összefoglaló. A megjelenített szöveg megegyezik a ValidateNone.cshtml bepillantásával.

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>

@* 省略 *@

A ValidateAll.cshtml oldalak majdnem azonosak, kivéve az Összes megadását az asp-validation-summary függvényhez.

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>

@* 省略 *@

Ellenőrizze a műveletet

Nincs

A program létrehozása után próbálja meg ellenőrizni a műveletet. asp-validation-summary=Nincs képernyő.

Mivel a "Közvetlen hibabevitel" a kezdeti megjelenítési állapotban jelenik meg, úgy tűnik, hogy nem használható alapértelmezett hibaüzenetként. Vannak olyan paraméterek, amelyek kötelezőre vannak állítva, ezért folytassuk a frissítési folyamat ot.

A Nincs név ként hiba esetén semmi sem jelenik meg. Az alapértelmezett hibaüzenet érintetlen marad, így nem valószínű, hogy van esély a Nincs közvetlen beállítására és használatára. Ha van esélye használni, dinamikusan szeretné beállítani az értéket asp-érvényesítés-összefoglalóra, és nincs, ha nem szeretne hibaüzenetet látni?

ModelOnly

Asp-validation-summary= Amodellonly képernyő. Úgy gondolom, hogy van egy csomó használat jelenetek leginkább azért, mert jön ki a mintában az ellenőrzési hiba és állványzat.

Mivel a szöveg a "Hiba közvetlen bemenet", hogy került a div tag nem jelenik meg, úgy tűnik, hogy nincs probléma akkor is, ha tedd.

Ez egy olyan állapot, amelyben a regisztrációs folyamat történik, és a hiba jelenik meg. Az itt megjelenő üzenetek csak azok az alapértelmezett üzenetek, amelyeket korábban a div címkébe helyeztek el, és a kiszolgálóoldalon előforduló hibaüzenetek. Ne feledje azonban, hogy ha nincs üres kulcsüzenet a kiszolgáló oldalán, az üzenet a div tag nem jelenik meg.

A kiszolgáló oldalon két hibaüzenet jelenik meg, de csak a kulcsban üres karaktereket rejtő hibaüzenet jelenik meg. Ha megad egy kulcsot, a rendszer hibának tekinti az ezzel a névvel rendelkező modell tulajdonságában, így az nem jelenik meg az asp-validation-summary ban. Ehelyett egy üzenet jelenik meg minden címkén az azonos nevű asp-validation-for attribútummal.

Minden

Asp-validation-summary=Minden meg van adva a képernyőn.

Valamilyen oknál fogva megjelenik a beágyazott "közvetlen hibabevitel" szövege. Nem vagyok biztos benne, miért nem látom ModelOnly egyedül. Úgy tűnik, hogy a beágyazás egyelőre nem használható az Összes ben.

Ez egy képernyő a frissítési folyamat végrehajtása után. Az összes beviteli mezőre (tulajdonságra) vonatkozó hibaüzenetek egy listában jelennek meg. Minden beviteli mező egy hibaüzenetet is megjelenít, ezért ha a hiba összegzéséhez az Összes értéket szeretné megadni, Jobb lenne eltávolítani az asp-validation-for attribútumkészletet az egyes bemeneti mezőhöz.

A kiszolgálóoldalon hozzáadott hibaüzenetek is megjelennek. Azt is láthatja, hogy a kulccsal rendelkező hibát is megtekint.

Összefoglaló

Az Asp-validation-summary három paraméterrel volt megadva. Érdemes lehet használni ModelOnly, hogy könnyebben érthető, ahol a hiba, vagy hogy megszüntesse a párhuzamos. Ne feledje, hogy az asp-validation-summary üzenet csak egy üres kulccsal ellátott üzenet.

By the way, akkor adjunk hozzá annyi üzenetet, amennyit csak akar egy üres kulcsot, így nem kell kombinálni karakterláncok megjelenítéséhez több üzenetet.

Ha egy helyen szeretné összegyűjteni a hibaüzeneteket, A Nincs beállítás esetén akkor állítsa be dinamikusan, ha nem szeretné, hogy bármilyen okból hibaüzenet jelenjen meg. Jó használni acélra.