Zobacz, jak działa podsumowanie walidacji asp

Strona zaktualizowana :
Data utworzenia strony :

Środowiska

Visual Studio
  • Visual Studio 2019
Rdzeń ASP.NET
  • 3.0
  • 3.1

Na początku

ASP.NET Istnieje sposób, aby użyć asp-validation-summary jako sposób wyświetlania błędów sprawdzania poprawności danych wejściowych na ekranie w Core. Nie rozumiałem różnicy między parametrami, które mogłem określić, więc to sprawdziłem.

Istnieją trzy możliwe wartości:

  • Brak
  • ModelOnly
  • Wszystkie

W wyniku zbadania, jak działa każda z tych różnic, wynik jest następujący:

Przygotowanie wstępne

Na razie przygotujemy się do operacji. Większość z nich jest zbędna, więc jeśli chcesz tylko zobaczyć wyniki, zobacz drugą połowę artykułu.

To sprawdzanie poprawności zakłada, że chcesz zarejestrować użytkownika w formularzu, więc utworzymy model widoku dla użytkownika. Włożyłem różne przedmioty, ale zawartość nic nie ma znaczenia, ponieważ można sprawdzić, czy istnieje co najmniej jeden. Firma DataAnnotation zostanie sprawdzona, więc ustawimy atrybuty Wymagane i StringLength. Aby zobaczyć różnicę w zachowaniu, po prostu umieścić w dodatkowych IsAccepted.

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

Aby sprawdzić trzy wartości asp-validation-summary, należy utworzyć każdą akcję. Jednak ponieważ asp-validation-summary jest wątkiem po stronie widoku, zawartość każdej akcji są tego samego kodu, z wyjątkiem wiadomości.

Jeśli IsAccepted nie jest zaznaczone, dodajemy błąd. Błąd jest dodawany do błędu przy innym kluczu niż model i pustym kluczu.

Jeśli nie ma żadnych błędów, wyświetl komunikat o pomyślnej rejestracji.

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 dodaje łącze do strony, na której odbywa się każdy test.

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>

Jest to strona rejestracji użytkownika do weryfikacji. Jeśli występuje błąd, określ brak dla asp-validation-summary jako parametr do wyświetlania jego zawartości. Umieszczamy również zdanie "Błąd bezpośredni wpis" w tagu div, aby sprawdzić, czy wyświetlany jest domyślny komunikat o błędzie.

Inny kod nie jest szczegółowo omówione, ponieważ jest to kod, który został automatycznie wygenerowany przez szkielety na podstawie modelu. (Niektóre z nich zostały naprawione ręcznie, ale nie ma to nic wspólnego z tą weryfikacją).

Istnieje tag zakresu z atrybutem asp-validation-for ustawionym w pobliżu każdego pola wejściowego (znacznika wejściowego). Jest to znacznik (atrybut) do wyświetlania komunikatów o błędach dla każdego pola wejściowego. Niezależnie od parametru określonego w asp-validation-summary, komunikat o błędzie jest zawsze wyświetlany w tej lokalizacji, jeśli występuje błąd.

Ponadto asp-validation-summary wyświetla wyniki weryfikacji serwera, więc proces weryfikacji klienta (_ValidationScriptsPartial) komentuje.

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 strony są tylko chyba że określisz ModelOnly dla asp-validation-summary. Wyświetlany tekst jest taki sam jak plik ValidateNone.cshtml.

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>

@* 省略 *@

Strony ValidateAll.cshtml są prawie identyczne, z wyjątkiem określania wszystkich dla 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>

@* 省略 *@

Sprawdź operację

Brak

Po utworzeniu programu spróbuj sprawdzić operację. asp-validation-summary=Brak ekranu.

Ponieważ "Błąd bezpośredniego wejścia" jest wyświetlany w początkowym stanie wyświetlania, nie wydaje się być w stanie być używany jako domyślny komunikat o błędzie. Istnieją parametry, które zostały ustawione na Wymagane, więc kontynuujmy wykonywanie procesu aktualizacji.

Jako nazwa None, nic nie jest wyświetlane, jeśli występuje błąd. Domyślny komunikat o błędzie pozostaje nienaruszony, więc jest mało prawdopodobne, aby można było ustawić opcję None bezpośrednio i użyć go. Jeśli masz szansę go użyć, czy chcesz dynamicznie ustawić wartość asp-validation-summary i brak, jeśli nie chcesz widzieć błędu?

ModelOnly

Asp-validation-summary= Ekran zModelOnly. Myślę, że istnieje wiele scen użytkowania najbardziej, ponieważ wychodzi w próbce błędu weryfikacji i rusztowania.

Ponieważ tekst "Błąd bezpośredniego wejścia", który został umieszczony w znaczniku div nie jest wyświetlany, wydaje się, że nie ma problemu, nawet jeśli go umieścisz.

Jest to stan, w którym proces rejestracji jest wykonywany i wyświetlany jest błąd. Jedyne komunikaty wyświetlane w tym miejscu są domyślne wiadomości, które zostały wcześniej umieszczone w div tag i komunikaty o błędach, które wystąpiły po stronie serwera. Należy jednak pamiętać, że jeśli po stronie serwera nie ma pustej wiadomości z kluczem, komunikat w tagu div nie zostanie wyświetlony.

Po stronie serwera są umieszczane dwa komunikaty o błędach, ale wyświetlany jest tylko błąd z pustymi znakami w kluczu. Jeśli określisz klucz, będzie on traktowany jako błąd we właściwości modelu o tej nazwie, więc nie pojawi się w asp-validation-summary. Zamiast tego w dowolnym tagu pojawi się komunikat z atrybutem asp-validation-for o tej samej nazwie.

Wszystkie

Asp-validation-summary=Wszystko jest określone na ekranie.

Z jakiegoś powodu wyświetlany jest tekst osadzonego "bezpośredniego wejścia błędu". Nie jestem pewien, dlaczego nie widzę ModelOnly sam. Wydaje się, że osadzanie nie może być używane w All na razie.

Jest to ekran po zakończeniu procesu aktualizacji w taki sposób, w jakim jest. Komunikaty o błędach dla wszystkich pól wejściowych (właściwości) są wyświetlane na liście. Każde pole wejściowe wyświetla również komunikat o błędzie, więc jeśli chcesz określić wszystkie, aby podsumować błąd, Byłoby lepiej, aby usunąć asp-validation-for zestaw atrybutów dla każdego pola wejściowego.

Wyświetlane są również komunikaty o błędach dodane po stronie serwera. Widać również, że jest również wyświetlony błąd z kluczem.

Krótki opis

Asp-validation-summary miał trzy parametry. Można użyć ModelOnly, aby ułatwić zrozumienie, gdzie jest błąd lub wyeliminować powielanie. Należy zauważyć, że jedyną wiadomością wyświetlaną w asp-validation-summary jest komunikat z pustym kluczem.

Nawiasem mówiąc, można dodać dowolną liczbę wiadomości do pustego klucza, więc nie trzeba łączyć ciągów, aby wyświetlić wiele wiadomości.

Dla wszystkich, jeśli chcesz zbierać komunikaty o błędach w jednym miejscu, W przypadku brak ustawiaj dynamicznie, gdy nie chcesz, aby komunikat o błędzie był wyświetlany z jakiegokolwiek powodu. Dobrze jest go używać do tego celu.