देखें कि एएसपी-सत्यापन-सारांश कैसे काम करता है

पेज अद्यतन :
पेज निर्माण की तारीख :

वातावरण

विजुअल स्टूडियो
  • विजुअल स्टूडियो 2019
ASP.NET कोर
  • 3.0
  • 3.1

पहले

ASP.NET कोर में स्क्रीन पर इनपुट सत्यापन त्रुटियों को प्रदर्शित करने के तरीके के रूप में एएसपी-सत्यापन-सारांश का उपयोग करने का एक तरीका है। मैं वास्तव में मापदंडों है कि मैं निर्दिष्ट कर सकता है के बीच अंतर समझ में नहीं आया, तो मैं इसे जांच की ।

तीन संभावित मान हैं:

  • कोई नहीं
  • मॉडलनली
  • सभी

इन मतभेदों में से प्रत्येक कैसे काम करता है की जांच का एक परिणाम के रूप में, परिणाम इस प्रकार है:

पूर्व तैयारी

फिलहाल हम ऑपरेशन की तैयारी करेंगे। उनमें से ज्यादातर बेमानी हैं, इसलिए यदि आप केवल परिणाम देखना चाहते हैं, तो लेख का उत्तरार्ध देखें।

यह सत्यापन माना जाता है कि आप उपयोगकर्ता को फॉर्म में पंजीकृत करना चाहते हैं, इसलिए हम उपयोगकर्ता के लिए एक दृश्य मॉडल बनाएंगे। मैं विभिन्न आइटम डाल देता हूं, लेकिन सामग्री से कोई फर्क नहीं पड़ता क्योंकि यह सत्यापित करना संभव है कि कम से कम एक है या नहीं। हम डेटाननोटेशन के साथ जांच करेंगे, इसलिए हम आवश्यक और स्ट्रिंगलेंग विशेषताएं सेट करेंगे। व्यवहार में अंतर देखने के लिए, मैं सिर्फ एक अतिरिक्त 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; }
  }
}

एएसपी-सत्यापन-सारांश के तीन मूल्यों की जांच करने के लिए, प्रत्येक कार्रवाई बनाएं। हालांकि, चूंकि एएसपी-सत्यापन-सारांश एक दृश्य पक्ष की कहानी है, इसलिए प्रत्येक कार्रवाई की सामग्री संदेशों को छोड़कर सभी एक ही कोड हैं।

यदि 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 उस पृष्ठ का लिंक जोड़ता है जहां प्रत्येक परीक्षण किया जाता है।

इंडेक्स.सीसैटएमएल

@{
    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>

यह सत्यापन के लिए उपयोगकर्ता पंजीकरण पृष्ठ है। यदि कोई त्रुटि है, तो इसकी सामग्री प्रदर्शित करने के लिए एक पैरामीटर के रूप में एएसपी-सत्यापन-सारांश के लिए कोई भी निर्दिष्ट न करें। हम यह देखने के लिए कि डिफ़ॉल्ट त्रुटि संदेश प्रदर्शित किया गया है या नहीं, यह देखने के लिए हम "त्रुटि प्रत्यक्ष प्रविष्टि" वाक्य को भी डिव टैग में डालते हैं।

अन्य कोड पर विस्तार से चर्चा नहीं की जाती है क्योंकि यह वह कोड है जो मॉडल के आधार पर मचान द्वारा स्वचालित रूप से उत्पन्न किया गया था। (उनमें से कुछ हाथ से तय किया गया है, लेकिन यह कुछ भी नहीं इस सत्यापन के साथ नहीं है.)

प्रत्येक इनपुट फ़ील्ड (इनपुट टैग) के पास एएसपी-सत्यापन-फॉर कंट्रीब्यूशन सेट के साथ एक स्पैन टैग है। यह प्रत्येक इनपुट फ़ील्ड के लिए त्रुटि संदेश प्रदर्शित करने के लिए एक टैग (विशेषता) है. एएसपी-सत्यापन-सारांश में निर्दिष्ट पैरामीटर के बावजूद, यदि कोई त्रुटि है तो उस स्थान पर हमेशा एक त्रुटि संदेश प्रदर्शित किया जाता है।

इसके अलावा, एएसपी-सत्यापन-सारांश सर्वर सत्यापन परिणाम प्रदर्शित करता है, इसलिए ग्राहक सत्यापन प्रक्रिया (_ValidationScriptsPartial) टिप्पणी करता है।

मान्येनवन.सीएसएचटीएमएल

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

मान्यमॉडलनली.cshtml पृष्ठ केवल तभी तक हैं जब तक कि आप एएसपी-सत्यापन-सारांश के लिए मॉडल निर्दिष्ट न करें। डिस्प्ले टेक्स्ट मान्येनोन.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>

@* 省略 *@

मान्यऑल.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>

@* 省略 *@

ऑपरेशन की जांच करें

कोई नहीं

प्रोग्राम बनाने के बाद, ऑपरेशन की जांच करने का प्रयास करें। एएसपी-सत्यापन-सारांश =कोई स्क्रीन नहीं।

चूंकि प्रारंभिक प्रदर्शन राज्य में "त्रुटि प्रत्यक्ष इनपुट" प्रदर्शित किया जाता है, इसलिए यह एक डिफ़ॉल्ट त्रुटि संदेश के रूप में उपयोग करने में सक्षम नहीं लगता है। ऐसे पैरामीटर हैं जिन्हें आवश्यक रूप से सेट किया गया है, इसलिए आइए अपडेट प्रक्रिया जारी रखें।

किसी के नाम के रूप में, कुछ भी प्रदर्शित नहीं होता है यदि कोई त्रुटि है। डिफ़ॉल्ट त्रुटि संदेश बरकरार रहता है, इसलिए सीधे किसी को सेट करने और इसका उपयोग करने का मौका नहीं है। यदि आपके पास इसका उपयोग करने का मौका है, तो क्या आप गतिशील रूप से एएसपी-सत्यापन-सारांश के लिए मूल्य निर्धारित करना चाहते हैं और यदि आप कोई त्रुटि नहीं देखना चाहते हैं तो कोई नहीं?

मॉडलनली

एएसपी-सत्यापन-सारांश = मॉडलके साथ स्क्रीनकेवल। मुझे लगता है कि वहां का उपयोग दृश्यों का एक बहुत सबसे अधिक है क्योंकि यह सत्यापन त्रुटि और मचान के नमूने में बाहर आता है ।

चूंकि डिव टैग में रखे गए "त्रुटि प्रत्यक्ष इनपुट" का पाठ प्रदर्शित नहीं किया गया है, इसलिए ऐसा लगता है कि यदि आप इसे डालते हैं तो भी कोई समस्या नहीं है।

यह एक ऐसा राज्य है जिसमें पंजीकरण प्रक्रिया की जाती है और त्रुटि प्रदर्शित की जाती है। यहां प्रदर्शित केवल संदेश डिफ़ॉल्ट संदेश हैं जिन्हें पहले डिव टैग में रखा गया था और सर्वर की ओर से होने वाले त्रुटि संदेश। हालांकि, ध्यान दें कि अगर आपके पास सर्वर की तरफ से कोई खाली महत्वपूर्ण संदेश नहीं है, तो डिव टैग में संदेश दिखाई नहीं देगा।

सर्वर की ओर, दो त्रुटि संदेश डाल रहे हैं, लेकिन केवल कुंजी में खाली अक्षरों के साथ त्रुटि प्रदर्शित की जाती है। यदि आप एक कुंजी निर्दिष्ट करते हैं, तो इसे उस नाम के साथ मॉडल की संपत्ति में त्रुटि के रूप में माना जाएगा, इसलिए यह एएसपी-सत्यापन-सारांश में दिखाई नहीं देता है। इसके बजाय, एक संदेश एक ही नाम की विशेषता के लिए एएसपी-सत्यापन के साथ किसी भी टैग पर दिखाई देता है ।

सभी

एएसपी-सत्यापन-सारांश =सभी स्क्रीन पर निर्दिष्ट है।

किसी कारण से, एम्बेडेड "त्रुटि प्रत्यक्ष इनपुट" का पाठ प्रदर्शित किया जाता है। मुझे यकीन नहीं है कि मैं अकेले मॉडल क्यों नहीं देखता। ऐसा लगता है कि एम्बेडिंग का उपयोग समय के लिए सभी में नहीं किया जा सकता है।

यह अद्यतन प्रक्रिया के रूप में किया जाता है के बाद एक स्क्रीन है । सभी इनपुट फ़ील्ड (गुण) के लिए त्रुटि संदेश एक सूची में प्रदर्शित किए जाते हैं। प्रत्येक इनपुट फ़ील्ड एक त्रुटि संदेश भी प्रदर्शित करता है, इसलिए यदि आप त्रुटि को संक्षेप में प्रस्तुत करने के लिए सभी को निर्दिष्ट करना चाहते हैं, प्रत्येक इनपुट फ़ील्ड के लिए निर्धारित विशेषता के लिए एएसपी-सत्यापन को हटाना बेहतर होगा।

सर्वर की ओर जोड़े गए त्रुटि संदेश भी प्रदर्शित किए जाते हैं। आप यह भी देख सकते हैं कि आप कुंजी के साथ कोई त्रुटि भी देख रहे हैं।

सारांश

एएसपी-सत्यापन- सारांश के तीन पैरामीटर थे। आप मॉडल का उपयोग करना चाह सकते हैं ताकि यह समझना आसान हो सके कि त्रुटि कहां है, या दोहराव को खत्म करने के लिए। ध्यान दें कि एएसपी-सत्यापन-सारांश में प्रदर्शित एकमात्र संदेश एक खाली कुंजी के साथ एक संदेश है।

वैसे, आप एक खाली कुंजी के लिए जितने संदेश चाहते हैं, उतने संदेश जोड़ सकते हैं, इसलिए आपको कई संदेशों को प्रदर्शित करने के लिए तार ों को संयोजित करने की आवश्यकता नहीं है।

सभी के लिए, यदि आप एक ही स्थान पर त्रुटि संदेश एकत्र करना चाहते हैं, किसी के लिए, गतिशील रूप से सेट करें जब आप किसी भी कारण से त्रुटि संदेश नहीं लगाना चाहते हैं। इसके उद्देश्य के लिए इसका उपयोग करना अच्छा है।