ببینید asp-validation-summary چگونه کار می کند

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط

ویژوال استودیو
  • ویژوال استودیو ۲۰۱۹
ASP.NET هسته
  • ۳/۰
  • ۳/۱

در ابتدا

ASP.NET یک راه برای استفاده از asp-اعتبار سنجی-خلاصه به عنوان یک راه برای نمایش خطاهای اعتبار سنجی ورودی بر روی صفحه نمایش در هسته وجود دارد. من واقعا نمی فهمم تفاوت بین پارامترها که من می توانم مشخص, بنابراین من آن را بررسی.

سه مقدار ممکن وجود دارد:

  • هیچ کدام
  • ModelOnly
  • همه

در نتیجه بررسی چگونگی هر یک از این تفاوت ها کار می کند ، نتیجه به شرح زیر است:

پیش آماده سازی

در حال حاضر ، ما برای عملیات آماده خواهد شد. اکثر آنها از کار برکنار شده است ، بنابراین اگر شما فقط می خواهید برای دیدن نتایج ، نگاه کنید به نیمه دوم مقاله است.

این اعتبار فرض می کند که شما می خواهید برای ثبت نام کاربر در فرم ، بنابراین ما یک مدل نمایش برای کاربر ایجاد کنید. من قرار دادن آیتم های مختلف, اما مطالب هر چیزی مهم نیست چرا که ممکن است به منظور بررسی اگر حداقل یک وجود دارد. ما با DataAnnotation چک کنید ، بنابراین خواهیم ویژگی های مورد نیاز و StringLength مجموعه. برای دیدن تفاوت در رفتار ، من فقط در IsAccepted شده اضافی قرار داده است.

* * مدل/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-اعتبار سنجی-خلاصه ، هر عمل را ایجاد کنید. با این حال ، از آنجا که asp-اعتبارسنجی-خلاصه یک داستان سمت نمایش است ، محتویات هر عمل به جز پیام ها ، همان کد است.

اگر IsAccepted شده است بررسی نمی, ما در حال اضافه کردن یک خطا. خطا به خطا با یک کلید متفاوت از مدل و یک کلید خالی اضافه شده است.

اگر هیچ خطایی وجود نداشته باشد ، یک پیام ثبت نام موفق را نمایش دهید.

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 می افزاید: یک لینک به صفحه که در آن هر تست انجام شده است.

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>

این صفحه ثبت نام کاربر برای تأیید است. اگر یک خطا وجود دارد ، مشخص کنید هیچ برای asp-اعتبار سنجی-خلاصه به عنوان یک پارامتر برای نمایش محتویات آن. ما همچنین قرار "خطا مستقیم ورود" حکم در تگ div برای دیدن اگر پیام خطا به طور پیش فرض نمایش داده می شود.

کد دیگر در جزئیات مورد بحث نیست ، زیرا این کد که به طور خودکار توسط داربست بر اساس مدل تولید شد. (برخی از آنها با دست ثابت شده است ، اما هیچ ربطی به این تایید ندارد.)

یک تگ گستردگی با asp-اعتبارسنجی-برای مجموعه ویژگی در نزدیکی هر فیلد ورودی (برچسب ورودی) وجود دارد. این یک برچسب (صفت) برای نمایش پیام های خطا برای هر فیلد ورودی است. صرف نظر از پارامتر مشخص شده در asp-اعتبار سنجی-خلاصه ، یک پیام خطا همیشه در آن محل نمایش داده می شود اگر یک خطا وجود دارد.

همچنین ، asp-اعتبارسنجی-خلاصه نتایج تایید سرور را نمایش می دهد ، بنابراین فرآیند اعتبار سنجی مشتری (_ValidationScriptsPartial) نظرات.

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 تنها مگر اینکه شما را مشخص modelonly برای asp-اعتبار سنجی-خلاصه. متن نمایش همان ValidateNone. cshtml peeking در است.

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>

@* 省略 *@

همه صفحات ، تقریبا یکسان هستند مگر برای مشخص کردن همه برای asp-اعتبار سنجی-خلاصه.

ولی امر. 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>

@* 省略 *@

بررسی عملیات

هیچ کدام

بعد از اینکه برنامه را ایجاد کردید ، سعی کنید عملیات را بررسی نمایید. ماشماهی-اعتبار سنجی-خلاصه =هیچ صفحه نمایش.

از آنجا که "خطا مستقیم ورودی" در حالت نمایش اولیه نمایش داده می شود ، به نظر نمی رسد قادر به عنوان یک پیام خطای پیش فرض مورد استفاده قرار گیرد. پارامترهایی وجود دارند که به صورت مورد نیاز تنظیم شده اند ، بنابراین اجازه دهید روند بروز رسانی را ادامه دهیم.

همانطور که از نام هیچ, هیچ چیز نمایش داده می شود اگر یک خطا وجود دارد. پیام خطای پیش فرض دست نخورده باقی می ماند ، بنابراین بعید است فرصتی برای تنظیم هیچ به طور مستقیم و استفاده از آن وجود دارد. اگر شما یک فرصت برای استفاده از آن ، آیا شما می خواهید به صورت پویا تنظیم ارزش به asp-اعتبار سنجی-خلاصه و هیچ اگر شما نمی خواهید برای دیدن یک خطا ؟

ModelOnly

Asp-اعتبار سنجی-خلاصه = صفحه باModelonly. من فکر می کنم که بسیاری از صحنه های استفاده وجود دارد بیشتر به دلیل آن را در نمونه ای از خطا تایید و داربست می آید.

از آنجا که متن "خطا در ورودی مستقیم" که در تگ div قرار داده شده است نمایش داده نمی شود ، به نظر می رسد که هیچ مشکلی وجود دارد حتی اگر شما آن را قرار داده است.

این یک دولت است که در آن فرایند ثبت نام انجام شده است و خطا نمایش داده می شود. تنها پیام های نمایش داده شده در اینجا پیام های پیش فرض که قبلا در تگ div قرار داده شد و پیام های خطا که در سمت سرور رخ داده است. توجه داشته باشید ، با این حال ، که اگر شما یک پیام کلیدی خالی در سمت سرور ندارد ، پیام در تگ div ظاهر نخواهد شد.

در سمت سرور ، دو پیام خطا قرار داده شده است ، اما تنها خطا با شخصیت های خالی در کلید نمایش داده می شود. اگر شما تعیین یک کلید ، آن را به عنوان یک خطا در اموال مدل با آن نام درمان می شود ، پس از آن در ماشماهی-اعتبار سنجی خلاصه ظاهر نمی شود. در عوض ، یک پیام به نظر می رسد در هر تگ با asp-اعتبار سنجی-برای ویژگی از همان نام.

همه

ماشماهی-اعتبار سنجی-خلاصه =همه بر روی صفحه نمایش مشخص شده است.

برای برخی از این دلیل ، متن جاسازی شده "خطا ورودی مستقیم" نمایش داده می شود. من مطمئن نیستم که چرا من ModelOnly تنها به تنهایی نمی بینم. به نظر می رسد که تعبیه را نمی توان در همه زمان ها استفاده کرد.

این یک صفحه نمایش پس از فرآیند به روز رسانی انجام شده است به عنوان آن است. پیام های خطا برای همه زمینه های ورودی (ویژگی ها) در یک لیست نمایش داده می شوند. هر فیلد ورودی نیز یک پیام خطا را نمایش می دهد ، بنابراین اگر می خواهید همه را به طور خلاصه خطا مشخص کنید ، بهتر است برای حذف asp-اعتبار سنجی-برای تنظیم ویژگی برای هر زمینه ورودی.

پیام های خطا اضافه شده در سمت سرور نیز نمایش داده می شود. شما همچنین می توانید ببینید که شما نیز در حال مشاهده خطا با کلید.

خلاصه

Asp-اعتبار سنجی-خلاصه سه پارامتر داشت. شما ممکن است بخواهید به استفاده از ModelOnly به آن را آسان تر به درک که در آن خطا است ، و یا برای از بین بردن تکراری. توجه داشته باشید که تنها پیام نمایش داده شده در asp-اعتبارسنجی-خلاصه یک پیام با یک کلید خالی است.

به هر حال ، شما می توانید به عنوان بسیاری از پیام ها به عنوان شما می خواهید به یک کلید خالی اضافه کنید ، بنابراین شما مجبور به ترکیب رشته ها برای نمایش پیام های متعدد.

برای همه ، اگر می خواهید پیام های خطا را در یک مکان جمع آوری کنید ، برای هیچ, تنظیم به صورت پویا زمانی که شما نمی خواهید یک پیام خطا به هر دلیلی ظاهر می شود. خوب است به استفاده از آن به منظور.