Lihat bagaimana ringkasan pengesahan ASP berfungsi

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran

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

Pada mulanya

ASP.NET ada cara untuk menggunakan asp-validasi-ringkasan sebagai satu cara untuk memaparkan kesilapan pengesahan input pada skrin dalam teras. Saya tidak benar-benar memahami perbezaan antara parameter yang boleh saya tentukan, jadi saya menyemaknya.

Terdapat tiga nilai yang mungkin:

  • Tiada
  • ModelOnly
  • Semua

Hasil daripada memeriksa bagaimana setiap perbezaan ini berfungsi, hasilnya adalah seperti berikut:

Pra-persediaan

Buat masa ini, kami akan menyediakan untuk operasi. Kebanyakan mereka adalah berlebihan, jadi jika anda hanya mahu melihat keputusan, lihat separuh kedua daripada artikel.

Pengesahan ini menganggap bahawa anda ingin mendaftarkan pengguna dalam bentuk, jadi kami akan mencipta model pandangan untuk pengguna. Saya meletakkan pelbagai item, tetapi kandungan tidak kira apa-apa kerana ia adalah mungkin untuk mengesahkan jika ada sekurang-kurangnya satu. Kami akan menyemak dengan Dataannotasi, jadi kami akan menetapkan atribut yang diperlukan dan StringLength. Untuk melihat perbezaan dalam tingkah laku, saya hanya meletakkan tambahan yang diterima.

* * Model/kaedah Userview* *

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

Untuk memeriksa tiga nilai-ringkasan ASP-pengesahan, buat setiap tindakan. Walau bagaimanapun, sejak ASP-validasi-ringkasan adalah cerita sisi pandangan, kandungan setiap tindakan semua kod yang sama kecuali untuk mesej.

Jika Isterima tidak disemak, kami sedang menambah ralat. Ralat ditambah kepada ralat dengan kekunci berbeza daripada model dan kekunci kosong.

Jika tiada ralat, paparkan mesej pendaftaran yang berjaya.

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 menambah pautan ke laman di mana setiap ujian dilakukan.

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>

Ini adalah halaman pendaftaran pengguna untuk pengesahan. Jika terdapat ralat, tentukan tiada untuk ASP-pengesahan-ringkasan sebagai parameter untuk memaparkan kandungannya. Kami juga meletakkan ayat "Ralat kemasukan langsung" dalam tag DIV untuk melihat sama ada mesej ralat lalai dipaparkan.

Kod lain tidak dibincangkan secara terperinci kerana ia adalah kod yang dihasilkan secara automatik oleh perancah berdasarkan model. (Sesetengah daripada mereka telah dibaiki dengan tangan, tetapi ia tidak mempunyai apa-apa kaitan dengan pengesahan ini.)

Terdapat tag SPAN dengan ASP-pengesahan-untuk set berhampiran setiap medan input (tag input). Ini adalah tag (atribut) untuk memaparkan mesej ralat untuk setiap medan input. Tanpa mengira parameter yang dinyatakan dalam ASP-validasi-ringkasan, mesej ralat sentiasa dipaparkan dalam lokasi itu jika terdapat ralat.

Juga, ASP-pengesahan-ringkasan memaparkan keputusan pengesahan pelayan, jadi proses pengesahan pelanggan (_ValidationScriptsPartial) komentar.

Pengesahan salah satu. 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");}
}*@

Sah Atemodelonly. Laman cshtml hanya melainkan anda menentukan ModelOnly untuk ASP-validasi-ringkasan. Teks paparan adalah sama seperti yang mengesahkan atenone. cshtml mengintip at.

Sah Atemodelonly. 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>

@* 省略 *@

Mengesahkan semua muka surat. cshtml adalah hampir sama kecuali untuk menentukan Semua untuk ASP-validasi-ringkasan.

Pengesahan semua. 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>

@* 省略 *@

Semak operasi

Tiada

Selepas anda mencipta atur cara itu, cuba semak operasi. ASP-pengesahan-ringkasan =tiada skrin.

Oleh kerana "input langsung ralat" dipaparkan dalam keadaan paparan awal, ia tidak dapat digunakan sebagai mesej ralat lalai. Terdapat parameter yang telah ditetapkan untuk diperlukan, jadi Mari kita terus melaksanakan proses kemas kini.

Sebagai nama tiada, tiada apa yang dipaparkan jika terdapat ralat. Mesej ralat lalai kekal utuh, jadi tidak mungkin ada peluang untuk menetapkan tiada langsung dan menggunakannya. Jika anda mempunyai peluang untuk menggunakannya, Adakah anda mahu secara dinamik menetapkan nilai kepada ASP-pengesahan-ringkasan dan tiada jika anda tidak mahu melihat ralat?

ModelOnly

ASP-pengesahan-ringkasan = skrin denganModelOnly. Saya berfikir bahawa terdapat banyak penggunaan adegan yang paling kerana ia keluar dalam sampel kesilapan pengesahan dan perancah.

Sejak teks "Ralat input langsung" yang diletakkan dalam tag DIV tidak dipaparkan, ia seolah-olah bahawa tidak ada masalah walaupun anda meletakkannya.

Ia adalah satu keadaan di mana proses pendaftaran dilakukan dan ralat dipaparkan. Satu-satunya mesej yang dipaparkan di sini adalah mesej lalai yang sebelum ini diletakkan dalam tag DIV dan mesej ralat yang berlaku pada sisi pelayan. Walau bagaimanapun, ambil perhatian bahawa jika anda tidak mempunyai mesej kekunci kosong di sebelah pelayan, mesej dalam tag DIV tidak akan muncul.

Pada sisi pelayan, dua mesej ralat dimasukkan, tetapi hanya ralat dengan aksara kosong dalam kekunci dipaparkan. Jika anda menentukan kunci, ia akan dianggap sebagai ralat dalam harta model dengan nama itu, jadi ia tidak muncul dalam ringkasan ASP-pengesahan. Sebaliknya, mesej muncul di mana-mana tag dengan ASP-pengesahan-untuk nama yang sama.

Semua

ASP-pengesahan-ringkasan =Semua dinyatakan pada skrin.

Untuk sesetengah sebab, teks "input langsung ralat" tertanam dipaparkan. Saya tidak pasti mengapa saya tidak melihat ModelOnly sendirian. Nampaknya bahawa emperalatan tidak boleh digunakan dalam semua masa.

Ia adalah skrin selepas proses kemas kini dilakukan kerana ia adalah. Mesej ralat untuk semua medan input (sifat) dipaparkan dalam senarai. Setiap medan input juga memaparkan mesej ralat, jadi jika anda mahu menentukan semua untuk meringkaskan ralat, Adalah lebih baik untuk membuang ASP-validasi-untuk set atribut untuk setiap bidang input.

Mesej ralat yang ditambah pada sisi pelayan juga dipaparkan. Anda juga boleh melihat bahawa anda juga melihat ralat dengan kekunci.

Ringkasan

ASP-pengesahan-ringkasan mempunyai tiga parameter. Anda mungkin mahu menggunakan ModelOnly untuk menjadikannya lebih mudah untuk memahami di mana kesilapan itu, atau untuk menghapuskan pertindihan. Ambil perhatian bahawa satu-satunya mesej yang dipaparkan dalam ASP-pengesahan-ringkasan adalah mesej dengan kekunci kosong.

Dengan cara ini, anda boleh menambah seberapa banyak mesej yang anda mahu untuk kekunci kosong, jadi anda tidak perlu menggabungkan rentetan untuk memaparkan berbilang mesej.

Untuk semua, jika anda mahu mengumpul mesej ralat dalam satu tempat, Tiada, yang ditetapkan secara dinamik apabila anda tidak mahu mesej ralat muncul untuk sebarang sebab. Ia adalah baik untuk menggunakannya untuk tujuan.