ASP.NET MVC Html.ValidationSummary (सत्य) मॉडल त्रुटियों को प्रदर्शित नहीं करता है


194

मुझे Html.ValidationSummary से कुछ समस्या है। मैं ValidationSummary में संपत्ति त्रुटियों को प्रदर्शित नहीं करना चाहता। और जब मैं Html.ValidationSummary (true) सेट करता हूं तो यह ModelState के त्रुटि संदेश प्रदर्शित नहीं करता है। जब स्ट्रिंग पर नियंत्रक क्रिया में कुछ अपवाद होता है

MembersManager.RegisterMember(member);

पकड़ अनुभाग मॉडलस्टेट में एक त्रुटि जोड़ता है:

ModelState.AddModelError("error", ex.Message);

लेकिन ValidationSummary इस त्रुटि संदेश को प्रदर्शित नहीं करता है। जब मैं Html.ValidationSummary (गलत) सेट करता हूं, तो सभी संदेश प्रदर्शित हो रहे हैं, लेकिन मैं संपत्ति त्रुटियों को प्रदर्शित नहीं करना चाहता। मैं इस समस्या को कैसे ठीक करुं?

यहाँ कोड का उपयोग कर रहा हूँ:

नमूना:

public class Member
{
        [Required(ErrorMessage = "*")]
        [DisplayName("Login:")]
        public string Login { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Password:")]
        public string Password { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Confirm Password:")]
        public string ConfirmPassword { get; set; }
}

नियंत्रक:

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
        if (!ModelState.IsValid)
            return View();

        MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("error", ex.Message);

        return View(member);
    }
}

राय:

<% using (Html.BeginForm("Register", "Members", FormMethod.Post, 
                        new { enctype = "multipart/form-data" })) {%> 
    <p>
        <%= Html.LabelFor(model => model.Login)%>
        <%= Html.TextBoxFor(model => model.Login)%>
        <%= Html.ValidationMessageFor(model => model.Login)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.Password)%>
        <%= Html.PasswordFor(model => model.Password)%>
        <%= Html.ValidationMessageFor(model => model.Password)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.ConfirmPassword)%>
        <%= Html.PasswordFor(model => model.ConfirmPassword)%>
        <%= Html.ValidationMessageFor(model => model.ConfirmPassword)%>
    </p>

    <div>
        <input type="submit" value="Create" />
    </div>

    <%= Html.ValidationSummary(true)%>
<% } %>

जवाबों:


324

मेरा मानना ​​है कि जिस तरह से वैलिडेशनस्मरीरी झंडा काम करता है वह केवल string.emptyकुंजी के रूप में मॉडलरियर्स प्रदर्शित करेगा । अन्यथा यह माना जाता है कि यह एक संपत्ति त्रुटि है। आपके द्वारा जोड़ी जा रही कस्टम त्रुटि में कुंजी 'त्रुटि' है, इसलिए जब आप ValidationSummary (सत्य) कहते हैं तो यह प्रदर्शित नहीं होगी। आपको इस तरह एक खाली कुंजी के साथ अपना कस्टम त्रुटि संदेश जोड़ना होगा:

ModelState.AddModelError(string.Empty, ex.Message);

9
@LordCover: मैं यह अनुमान लगा रहा हूं कि यह "डिज़ाइन के अनुसार काम कर रहा है" और बग नहीं है - डिफ़ॉल्ट रूप से उपयोग किए गए ValidationSummary () का अधिभार मॉडल के गुणों से जुड़ी मॉडलस्टेट त्रुटियों को स्वयं से बाहर करता है। यह उन त्रुटियों को Html द्वारा दर्शाया जाना छोड़ता है। अमान्यकरण मेसेजेज () प्रत्येक व्यक्तिगत संपत्ति के लिए कॉल करता है, बिना सारांश में उन्हें दोहराए। यह ध्यान में रखते हुए, यह प्रतीत होता है कि गैर-रिक्त कुंजी के साथ जोड़ा गया कोई भी मॉडल त्रुटि को मॉडल संपत्ति से संबद्ध माना जाता है, भले ही कुंजी किसी संपत्ति के नाम से मेल न खाती हो।
डैनियल शेफ़र

26
अन्य कार्यान्वयनकर्ताओं के लिए बस एक नोट: ModelState.AddModelError(string.Empty, ex);या तो काम करने के लिए प्रतीत नहीं होता है। आपको ModelState.AddModelError(string, string)ऊपर दिखाए अनुसार ओवरलोड का उपयोग करना होगा ।
वुल्फिकुक

2
अद्यतन: MVC4 में यह अब मामला नहीं लगता है। ModelState.AddModelError ("", ex.Message); काम करता है
नील थॉम्पसन

4
MVC5 मुझे अभी भी काम करने के लिए इसे प्राप्त करने के लिए ex.Message को कॉल करने की आवश्यकता थी।
स्मिग्लिवर्थ

दिन बचाया! MVC5 में अभी भी कुछ मुद्दे हैं :)
juFo

67

यह बेहतर काम करता है, क्योंकि आप एक निर्दिष्ट कुंजी के लिए सत्यापन दिखा सकते हैं:

    ModelState.AddModelError("keyName","Message");

और इसे इस तरह प्रदर्शित करें:

    @Html.ValidationMessage("keyName")

28

मुझे पता है कि यह पुराना है और 147 वोटों के साथ उत्तर के रूप में चिह्नित किया गया है, लेकिन विचार करने के लिए कुछ और है।

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

    //   excludePropertyErrors:
    //   true to have the summary display model-level errors only, or false to have
    //   the summary display all errors.
    public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors);

यहां छवि विवरण दर्ज करें


5
हाँ! बस परिवर्तित @Html.ValidationSummary(true, "", new { @class = "text-danger" })करें@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem

7

शायद इस तरह:

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
       if (!ModelState.IsValid)
       {
          ModelState.AddModelError("keyName", "Form is not valid");
          return View();
       }
       MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
       ModelState.AddModelError("keyName", ex.Message);
       return View(member);
    }
}

और प्रदर्शन में जोड़ें:

<div class="alert alert-danger">
  @Html.ValidationMessage("keyName")
</div>

या

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>

5
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

इस लाइन का उपयोग करना सहायक हो सकता है


Cshtml फ़ाइल में th ऊपर लाइन जोड़ें।
सैकिंड

2

मेरे मामले में यह वापसी के कारण काम नहीं कर रहा था।

के बजाय का उपयोग करने का:

return RedirectToAction("Rescue", "CarteiraEtapaInvestimento", new { id = investimento.Id, idCarteiraEtapaResgate = etapaDoResgate.Id });

मैंनें इस्तेमाल किया:

return View("ViewRescueCarteiraEtapaInvestimento", new CarteiraEtapaInvestimentoRescueViewModel { Investimento = investimento, ValorResgate = investimentoViewModel.ValorResgate });

यह एक मॉडल है, इसलिए यह ModelState.AddModelError("keyName","Message");एक मॉडल के साथ काम करना चाहिए।

यह जवाब क्यों दिखा। DataAnnotations के साथ सत्यापन जोड़ना


0

यदि लगभग सब कुछ सही लगता है, तो देखने के लिए एक और बात यह सुनिश्चित करना है कि सत्यापन सारांश स्पष्ट रूप से कुछ CSS ओवरराइड के माध्यम से छिपाया नहीं जा रहा है :

.validation-summary-valid {
    display: none;
}

यह भी @Html.ValidationSummaryछिपे हुए दिखाई देने का कारण हो सकता है , क्योंकि सारांश को validation-summary-validकक्षा के साथ गतिशील रूप से प्रस्तुत किया जाता है ।



-4

इसे सबसे निचले हिस्से में जोड़ें और अपने दृश्य:

@ स्क्रिप्च लिपियों {@ स्क्रिप्स.रेंडर ("~ / बंडलों / jqueryval")}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.