Sužinokite, kaip veikia ASP patvirtinimo suvestinė

Puslapis atnaujintas :
Puslapio sukūrimo data :

Aplinkos

"Visual" studija
  • Visual Studio 2019
ASP.NET branduolys
  • 3.0
  • 3.1

Iš pradžių

ASP.NET Yra būdas naudoti asp-validation-summary kaip būdas rodyti įvesties tikrinimo klaidų core ekrane. Aš tikrai nesuprantu skirtumo tarp parametrų, kuriuos galėjau nurodyti, todėl patikrinau.

Yra trys galimos reikšmės:

  • Nė vienas
  • ModelisTik
  • Visus

Nagrinėjant, kaip veikia kiekvienas iš šių skirtumų, rezultatas yra toks:

Paruošiamojo paruošimo

Šiuo metu mes pasiruošime operacijai. Dauguma jų yra nereikalingas, todėl, jei norite matyti tik rezultatus, žr.

Šis tikrinimas reiškia, kad norite užregistruoti vartotoją formoje, todėl sukursime vartotojo rodinio modelį. Aš įdėti įvairius elementus, bet turinys neturi nieko, nes tai galima patikrinti, ar yra bent vienas. Patikrinsime DataAnnotation, todėl nustatysime atributus Būtina ir StringLength. Norėdami pamatyti elgesio skirtumą, aš tiesiog įdėti į papildomą IsAccepted.

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

Norėdami patikrinti tris asp-validation-summary reikšmes, sukurkite kiekvieną veiksmą. Tačiau, kadangi asp-validation-summary yra peržiūrėti pusėje istorija, kiekvieno veiksmo turinys yra visi tą patį kodą, išskyrus pranešimus.

Jei IsAccepted nepažymėta, pridedame klaidą. Klaida įtraukiama į klaidą, kai yra kitoks nei modelis ir tuščias raktas.

Jei klaidų nėra, parodykite sėkmingą registracijos pranešimą.

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 prideda nuorodą į puslapį, kuriame atliekamas kiekvienas bandymas.

Index.cshtml (indeksas)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>

Tai naudotojo registracijos puslapis, skirtas patikrinti. Jei yra klaida, nurodykite nėra asp-validation-summary kaip parametras rodyti savo turinį. Mes taip pat įdėti sakinį "Klaida tiesioginis įrašas" div žymę, kad pamatytumėte, jei numatytasis klaidos pranešimas rodomas.

Kitas kodas išsamiai neaptariamas, nes tai yra kodas, kurį automatiškai generuoja pastoliai pagal modelį. (Kai kurie iš jų buvo užfiksuoti ranka, tačiau tai neturi nieko bendra su šiuo patikrinimu.)

Šalia kiekvieno įvesties lauko (įvesties žyma) yra patikros žymė su atributų rinkiniu asp-validation-for attribute set (įvesties žyma). Tai žyma (atributas), skirta rodyti kiekvieno įvesties lauko klaidų pranešimus. Neatsižvelgiant į asp-validation-summary nurodytą parametrą, toje vietoje visada rodomas klaidos pranešimas, jei yra klaida.

Be to, asp patvirtinimo suvestinė rodo serverio tikrinimo rezultatus, todėl kliento tikrinimo procesas (_ValidationScriptsPartial) komentarai.

PatvirtintiNone.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 puslapiai yra tik, jei nenurodysite ModelOnly asp-validation-summary. Rodomas tekstas yra toks pat kaip ValidateNone.cshtml peeking ne.

PatvirtintiModelOnly.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 puslapiai yra beveik identiški, išskyrus atvejus, kai nurodoma visi asp-validation-summary.

PatvirtintiVisą.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>

@* 省略 *@

Patikrinkite operaciją

Nė vienas

Sukūrę programą, pabandykite patikrinti operaciją. asp-validation-summary=Nėra ekrano.

Kadangi "Klaida tiesioginė įvestis" rodomas pradinio ekrano būseną, neatrodo, kad būtų galima naudoti kaip numatytąjį klaidos pranešimą. Yra parametrų, kurie buvo nustatyti kaip Reikia, todėl toliau atlikite naujinimo procesą.

Kaip nėra pavadinimas, nieko rodomas, jei yra klaida. Numatytasis klaidos pranešimas lieka nepakitęs, todėl mažai tikėtina, kad galimybė tiesiogiai nustatyti nėra ir jį naudoti. Jei turite galimybę jį naudoti, ar norite dinamiškai nustatyti reikšmę asp-validation-summary ir nėra, jei nenorite matyti klaidos?

ModelisTik

Asp-validation-summary = Ekranas suModelOnly. Manau, kad yra daug naudojimo scenos labiausiai, nes jis išeina į tikrinimo klaidos ir pastolių pavyzdys.

Kadangi tekstas "Klaida tiesioginė įvestis", kuris buvo įdėtas į div žyma nerodomas, atrodo, kad nėra jokių problemų, net jei jūs įtraukėte jį.

Tai būsena, kai atliekamas registracijos procesas ir rodoma klaida. Vieninteliai čia rodomi pranešimai yra numatytieji pranešimai, kurie anksčiau buvo dedami į div žymę, ir klaidų pranešimai, kurie įvyko serverio pusėje. Tačiau atkreipkite dėmesį, kad jei serverio pusėje neturite tuščio rakto pranešimo, pranešimas div žymėje nebus rodomas.

Serverio pusėje pateikiami du klaidų pranešimai, bet rodoma tik klaida su tuščiais simboliais rakte. Jei nurodysite raktą, jis bus laikomas modelio su tokiu pavadinimu ypatybės klaida, todėl jis nebus rodomas asp-validation-summary. Vietoj to, pranešimas rodomas bet žymę su asp-validation-for atributas to paties pavadinimo.

Visus

Asp-validation-summary=Visi yra nurodyta ekrane.

Dėl tam tikrų priežasčių, įterptųjų "klaida tiesioginė įvestis" tekstas rodomas. Nežinau, kodėl aš nematau ModelOnly atskirai. Atrodo, kad įdėjimas negali būti naudojamas visiems šiuo metu.

Tai ekranas po atnaujinimo proceso atlikimo, kaip yra. Sąraše rodomi visų įvesties laukų (ypatybių) klaidų pranešimai. Kiekviename įvesties lauke taip pat rodomas klaidos pranešimas, todėl, jei norite nurodyti Visi, kad apibendrintumėte klaidą, Būtų geriau pašalinti asp-validation-for atributų rinkinys kiekvienam įvesties laukui.

Taip pat rodomi serverio pusėje pridėti klaidų pranešimai. Taip pat galite matyti, kad taip pat peržiūrite klaidą naudodami raktą.

Santrauka

Asp patvirtinimo suvestinėje buvo trys parametrai. Galite naudoti ModelOnly, kad būtų lengviau suprasti, kur yra klaida, arba pašalinti dubliavimo. Atkreipkite dėmesį, kad vienintelis pranešimas, rodomas asp-validation-summary yra pranešimas su tuščiu raktu.

Beje, galite pridėti tiek pranešimų, kiek norite, į tuščią raktą, todėl jums nereikia sujungti eilučių, kad būtų rodomi keli pranešimai.

Visiems, jei norite rinkti klaidų pranešimus vienoje vietoje, Dalyje Nėra, nustatykite dinamiškai, kai nenorite, kad dėl kokios nors priežasties būtų rodomas klaidos pranešimas. Tai gerai jį naudoti tikslu.