এএসপি.নেট এমভিসি এইচটিএমএল.ভালিডেশনস্মামারি (সত্য) মডেল ত্রুটিগুলি প্রদর্শন করে না


194

আমার এইচটিএমএল.ভ্যালিডেশনসমেরিতে কিছু সমস্যা আছে। আমি ভ্যালিডেশনসমেরিতে সম্পত্তি ত্রুটিগুলি প্রদর্শন করতে চাই না। এবং আমি যখন এইচটিএমএল.ভালিডেশনসমেরি (সত্য) সেট করি তখন এটি মডেলস্টেট থেকে ত্রুটি বার্তা প্রদর্শন করে না। যখন স্ট্রিংটিতে কন্ট্রোলার অ্যাকশনে কিছু ব্যতিক্রম হয়

MembersManager.RegisterMember(member);

ক্যাচ বিভাগটি মডেলস্টেটে ত্রুটি যুক্ত করে:

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

তবে ভ্যালিডেশনসামারিটি এই ত্রুটি বার্তাটি প্রদর্শন করে না। আমি যখন এইচটিএমএল সেট করি তখন। ভ্যালিডেশনসমারি (মিথ্যা) সমস্ত বার্তা প্রদর্শিত হচ্ছে তবে আমি সম্পত্তি ত্রুটিগুলি প্রদর্শন করতে চাই না। আমি কিভাবে এই সমস্যা ঠিক করতে পারবো?

আমি যে কোডটি ব্যবহার করছি তা এখানে:

মডেল:

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কী হিসাবে মডেলএরফেস প্রদর্শন করবে । অন্যথায় এটি একটি সম্পত্তি ত্রুটি বলে ধরে নেওয়া হয়। আপনি যে কাস্টম ত্রুটিটি যুক্ত করছেন তাতে কী 'ত্রুটি' রয়েছে তাই আপনি যখন ভ্যালিডেশনসামারি (সত্য) কল করবেন তখন এটি প্রদর্শিত হবে না। খালি কী সহ আপনার নিজের কাস্টম ত্রুটি বার্তাটি যুক্ত করতে হবে:

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

9
@ লর্ডকভার: আমি অনুমান করছি যে এটি "নকশাকৃত হিসাবে কাজ করছে" এবং কোনও বাগ নয় - ডিফল্টরূপে ব্যবহৃত ভ্যালিডেশনসামারি () এর ওভারলোড মডেলের নিজস্ব বৈশিষ্ট্যগুলির সাথে সম্পর্কিত মডেলস্টেট ত্রুটিগুলি বাদ দেয়। এই ত্রুটিগুলি এইচটিএমএল দ্বারা উপস্থাপিত হতে দেয় alid.ভালিডেশনমেসেজ ফর () সংক্ষিপ্তসারে নকল না করে প্রতিটি পৃথক সম্পত্তি জন্য কল করে। মনে মনে, এটি খালি নয় যে কোনও মডেলের ত্রুটিটি শূন্য নয় কী দিয়ে যুক্ত করা হয়েছে বলে মনে করা হয়, এমনকি কী কোনও সম্পত্তির নামের সাথে মেলে না।
ড্যানিয়েল শেফার

26
অন্যান্য প্রয়োগকারীদের জন্য কেবল একটি নোট: ModelState.AddModelError(string.Empty, ex);এটিও কাজ করছে বলে মনে হয় না। ModelState.AddModelError(string, string)উপরে বর্ণিত হিসাবে আপনাকে ওভারলোডটি ব্যবহার করতে হবে ।
wolfyuk

2
আপডেট: এমভিসি 4 এ এটি আর হয় না বলে মনে হয়। ModelState.AddModelError ("", ex.Message); কাজ করে
নীল থম্পসন

4
এমভিসি 5 আমাকে এখনও প্রাক্তনকে কল করতে হবে it এটি কাজ করার জন্য ম্যাসেজ।
স্মাগলওয়ার্থ

দিন বাঁচাল! এমভিসি 5 এর এখনও কিছু সমস্যা রয়েছে :)
juFo

67

এটি আরও ভাল কাজ করে, আপনি যেমন একটি নির্দিষ্ট কীটির জন্য বৈধতা মেসেজ প্রদর্শন করতে পারেন:

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

এবং এটি এর মতো প্রদর্শন করুন:

    @Html.ValidationMessage("keyName")

28

আমি জানি এটি একধরনের পুরানো এবং 147 টি ভোট দিয়ে উত্তর হিসাবে চিহ্নিত হয়েছে, তবে বিবেচনার মতো আরও কিছু আছে।

আপনার কাছে সমস্ত মডেলের ত্রুটি থাকতে পারে, সম্পত্তি হিসাবে নামকরণ এবং স্ট্রিং করা যেতে পারে mp ভ্যালিডেশনসমেরিতে একটি ওভারলোড রয়েছে যা এটি করবে।

    //   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" })
জেনিনজেম

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" })

এই লাইনটি ব্যবহার করা সহায়ক হতে পারে


উপরের লাইনের সিএসটিএমএল ফাইল যুক্ত করুন।
সাচাইন্ড

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");কোনও মডেলের সাথে অবশ্যই কাজ করা উচিত ob

এই উত্তর কেন তা দেখায়। ডেটাঅ্যানোটেশনগুলির সাথে বৈধতা যুক্ত করা হচ্ছে


0

যদি প্রায় সবকিছু ঠিকঠাক মনে হয় তবে অন্য একটি জিনিস যাচাইয়ের জন্য নিশ্চিত হওয়া উচিত যে কিছু সিএসএস ওভাররাইডের মাধ্যমে বৈধতার সংক্ষিপ্তসারটি স্পষ্টভাবে গোপন করা হচ্ছে না :

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

এটি @Html.ValidationSummaryসংক্ষিপ্তভাবে validation-summary-validশ্রেণীর সাথে রেন্ডার করা হওয়ায় এটি গোপনে প্রদর্শিত হতে পারে ।



-4

এটিকে নীচের অংশে যুক্ত করুন এবং দেখুন:

@ সেকশন স্ক্রিপ্টস {@ স্ক্রিপ্টস R

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.