ASP doğrulama özetinin nasıl çalıştığını görün

Sayfa güncel :
Sayfa oluşturma tarihi :

Ortam

Görsel Stüdyo
  • Visual Studio 2019
ASP.NET Çekirdek
  • 3.0
  • 3.1

İlk başta

ASP.NET Core'da ekranda giriş doğrulama hatalarını görüntülemenin bir yolu olarak asp doğrulama-özetini kullanmanın bir yolu vardır. Ben gerçekten belirtebilirdi parametreleri arasındaki farkı anlamadı, bu yüzden kontrol etti.

Üç olası değer vardır:

  • Hiçbiri
  • ModelSadece
  • Tüm

Bu farklılıkların her birinin nasıl çalıştığını inceleme sonucunda, sonuç aşağıdaki gibidir:

Ön hazırlık

Şimdilik operasyona hazırlanacağız. Çoğu gereksizdir, bu nedenle yalnızca sonuçları görmek istiyorsanız, makalenin ikinci yarısına bakın.

Bu doğrulama, kullanıcıyı forma kaydetmek istediğinizi varsayar, bu nedenle kullanıcı için bir görünüm modeli oluştururuz. Ben çeşitli öğeleri koymak, ama en az bir olup olmadığını doğrulamak mümkün olduğu için içeriği önemli değil. DataAnnotation ile kontrol edeceğiz, bu nedenle Gerekli ve StringLength özniteliklerini ayarlayacağız. Davranış farkı görmek için, ben sadece ekstra bir IsAccepted koydu.

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

Asp-doğrulama-özetinin üç değerini incelemek için her eylemi oluşturun. Ancak, asp geçerliliği-özeti bir görünüm yan hikayesi olduğundan, her eylemin içeriği iletiler dışında aynı koddur.

IsAccepted denetlenmezse, bir hata ekliyoruz. Hata, modelden farklı bir anahtar ve boş bir anahtarla hataya eklenir.

Hata yoksa, başarılı bir kayıt iletisi görüntüleyin.

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, her testin yapıldığı sayfaya bir bağlantı ekler.

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>

Bu doğrulama için kullanıcı kayıt sayfasıdır. Bir hata varsa, içeriğini görüntülemek için bir parametre olarak asp geçerliliği-özeti için Yok belirtin. Ayrıca, varsayılan hata iletisinin görüntülenip görüntülenmedisini görmek için div etiketine "Hata Doğrudan Giriş" cümlesini de koyduk.

Modele dayalı iskele tarafından otomatik olarak oluşturulan kod olduğundan, diğer kod ayrıntılı olarak tartışılır. (Bazıları elle sabit edilmiştir, ancak bu doğrulama ile ilgisi yoktur.)

Her giriş alanının (giriş etiketi) yakınında asp-validation-for özniteliği ayarlanmış bir yayılma etiketi vardır. Bu, her giriş alanı için hata iletileri görüntülemek için bir etiket (öznitelik). Asp-doğrulama-özetinde belirtilen parametreden bağımsız olarak, bir hata varsa, bu konumda her zaman bir hata iletisi görüntülenir.

Ayrıca, asp doğrulama-özeti sunucu doğrulama sonuçlarını görüntüler, böylece istemci doğrulama işlemi (_ValidationScriptsPartial) dışarı yorumlar.

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

DoğrulaModelOnly.cshtml sayfaları yalnızca asp doğrulama-özeti için ModelOnly belirtmediğiniz sürece geçerlidir. Ekran metni, ValidateNone.cshtml ile aynıdır.

DoğrulaModelOnly.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 sayfaları asp-doğrulama-özeti için Tümü belirtme dışında hemen hemen aynıdır.

DoğrulamaAll.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>

@* 省略 *@

İşlemi kontrol edin

Hiçbiri

Programı oluşturduktan sonra, işlemi denetlemeyi deneyin. asp-doğrulama-özeti=Yok ekran.

"Hata doğrudan giriş" ilk görüntü durumunda görüntülendiğinden, varsayılan hata iletisi olarak kullanılabilecek gibi görünmüyor. Gerekli olarak ayarlanmış parametreler vardır, bu nedenle güncelleştirme işlemini gerçekleştirmeye devam edelim.

Yok adı olarak, bir hata varsa hiçbir şey görüntülenmez. Varsayılan hata iletisi bozulmadan kalır, bu nedenle Yok'u doğrudan ayarlamak ve kullanmak olası değildir. Kullanma şansınız varsa, bir hata görmek istemiyorsanız, değeri dinamik olarak asp doğrulama özetine ayarlamak istiyor musunuz?

ModelSadece

Asp-doğrulama-özeti= ModelOnly ileekran. Doğrulama hatası ve iskele örneğinde ortaya çıktığı için en çok kullanım sahneleri olduğunu düşünüyorum.

Div etiketine yerleştirilen "Hata doğrudan giriş" metni görüntülenmediğinden, koysanız bile bir sorun yok gibi görünün.

Kayıt işleminin gerçekleştirildiği ve hatanın görüntülendiği bir durumdur. Burada görüntülenen tek iletiler, daha önce div etiketine yerleştirilen varsayılan iletilerdir ve sunucu tarafında oluşan hata iletileridir. Ancak, sunucu tarafında boş bir anahtar iletisi yoksa, div etiketindeki iletinin görüntülenmeyeceğini unutmayın.

Sunucu tarafında, iki hata iletisi konur, ancak yalnızca anahtardaki boş karakterlerle ilgili hata görüntülenir. Bir anahtar belirtirseniz, bu ada sahip modelin özelliğinde bir hata olarak kabul edilir, bu nedenle asp geçerliliği-özetinde görünmez. Bunun yerine, aynı adı taşıyan asp geçerliliği özniteliği olan herhangi bir etikette bir ileti görüntülenir.

Tüm

Asp-doğrulama-özeti=Tüm ekranda belirtilir.

Nedense, katıştırılmış "hata doğrudan giriş" metni görüntülenir. ModelOnly'ı neden yalnız görmediğimden emin değilim. Bu katıştırma şimdilik Tüm kullanılamaz gibi görünüyor.

Güncelleştirme işlemi olduğu gibi gerçekleştirildikten sonra bir ekrandır. Tüm giriş alanları (özellikleri) için hata iletileri bir listede görüntülenir. Her giriş alanı da bir hata iletisi görüntüler, bu nedenle hata özetlemek için Tüm belirtmek istiyorsanız, Her giriş alanı için asp-doğrulama özniteliği kümesini kaldırmak daha iyi olacaktır.

Sunucu tarafına eklenen hata iletileri de görüntülenir. Ayrıca, anahtarla ilgili bir hata görüntülediğinizi de görebilirsiniz.

Özet

Asp-doğrulama-özetinin üç parametresi vardı. Hatanın nerede olduğunu anlamanızı kolaylaştırmak veya yinelemeyi ortadan kaldırmak için ModelOnly'i kullanmak isteyebilirsiniz. Asp doğrulama özetinde görüntülenen tek iletinin boş anahtarlı bir ileti olduğunu unutmayın.

Bu arada, boş bir anahtara istediğiniz kadar ileti ekleyebilirsiniz, böylece birden çok ileti görüntülemek için dizeleri birleştirmeniz gerekmez.

Herkes için, hata iletilerini tek bir yerde toplamak istiyorsanız, Yok için, herhangi bir nedenle bir hata iletisi görünmesini istemiyorsanız dinamik olarak ayarlayın. Bu amaç için kullanmak iyidir.