আমি কীভাবে এএসপি.নেট এমভিসিতে মডেল রাজ্য ত্রুটিগুলির সংগ্রহ পেতে পারি?


145

আমি কীভাবে একটি দৃষ্টিতে ত্রুটিগুলির সংগ্রহ পেতে পারি?

আমি এইচটিএমএল সহায়ক সহায়ক বৈধকরণ সংক্ষিপ্তকরণ বা বৈধকরণ বার্তাটি ব্যবহার করতে চাই না। পরিবর্তে আমি ত্রুটিগুলি পরীক্ষা করতে চাই এবং যদি কোনও নির্দিষ্ট ফর্ম্যাটে তাদের প্রদর্শন করে। ইনপুট নিয়ন্ত্রণগুলিতেও আমি একটি নির্দিষ্ট সম্পত্তি ত্রুটি পরীক্ষা করতে এবং ইনপুটটিতে একটি শ্রেণি যুক্ত করতে চাই।

পিএস আমি স্পার্ক ভিউ ইঞ্জিন ব্যবহার করছি তবে ধারণাটি একই হওয়া উচিত।

সুতরাং আমি অনুভব করেছি যে আমি এমন কিছু করতে পারি ...

<if condition="${ModelState.Errors.Count > 0}">
  DispalyErrorSummary()
</if>

....and also...

<input type="text" value="${Model.Name}" 
       class="?{ModelState.Errors["Name"] != string.empty} error" />

....

বা এমন কিছু।

হালনাগাদ

আমার চূড়ান্ত সমাধানটি এরকম দেখাচ্ছে:

<input type="text" value="${ViewData.Model.Name}" 
       class="text error?{!ViewData.ModelState.IsValid && 
                           ViewData.ModelState["Name"].Errors.Count() > 0}" 
       id="Name" name="Name" />

এটি কেবল ত্রুটি সিএসএস ক্লাস যুক্ত করে যদি এই সম্পত্তিটিতে ত্রুটি থাকে।


উত্তর:


210
<% ViewData.ModelState.IsValid %>

অথবা

<% ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1) %>

এবং একটি নির্দিষ্ট সম্পত্তি জন্য ...

<% ViewData.ModelState["Property"].Errors %> // Note this returns a collection

1
মডেলস্টেটের সম্পত্তি অভিধান নামটি টাইপ করে কী নামটি ভিউডাটা পাস করার জন্য ত্রুটিটি পেতে হয় M মডেলস্টেট ["নাম"]

"ভিউডাটা.মোডেলস্টেট [" সম্পত্তি "] সম্পর্কিত Er ত্রুটিগুলি" যদি সম্পত্তি "নামে কোনও চাবি না থাকে তবে এটি কি একটি নাল রেফারেন্স ব্যতিক্রম নষ্ট করবে? ত্রুটিগুলি পড়ার আগে ভিউডাটা.মোডেলস্টেট ["সম্পত্তি"] এ শূন্য করার জন্য প্রথমে ভাল যাচাই করা ভাল?
ডেভিড হলোয়েল - এমএসএফটি

@ ডেভ হ্যাঁ, আপনার প্রথমে সম্পূর্ণরূপে অস্তিত্বের জন্য যাচাই করা উচিত
অ্যালেক্স লিম্যান

61

মডেলস্টেট থেকে কেবল ত্রুটিগুলি পেতে, এই লিনকটি ব্যবহার করুন:

var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors);

2
যদি নির্দিষ্ট নামের সাথে কী না থাকে তবে এটি কি নাল রেফারেন্স ব্যতিক্রমটি ছুঁড়ে ফেলবে? ত্রুটিগুলি পড়ার আগে ভিউডাটা.মডেলস্টেট [কী] থেকে প্রথমে নাল পরীক্ষা করা ভাল হবে?
ডেভিড হলোয়েল - এমএসএফটি

5
কারণ আমরা এটিকে পুনরাবৃত্তি করেই শুরু করি M মডেলস্টেট.কিগুলি, আমি কী কীটনাউন্ডআউটসেপশনের সম্ভাবনা দেখতে পাচ্ছি না। আমি মনে করি যে চেকটি ওভারকিল হবে।
ক্রিস ম্যাককেঞ্জি


28

এটি আপনাকে কমা পৃথককরণের সাথে সমস্ত ত্রুটি সহ একটি স্ট্রিং দেবে

string validationErrors = string.Join(",",
                    ModelState.Values.Where(E => E.Errors.Count > 0)
                    .SelectMany(E => E.Errors)
                    .Select(E => E.ErrorMessage)
                    .ToArray());

এই সম্পূর্ণ তালিকায় এটিই আমি খুঁজে পেয়েছি যা আসলে ত্রুটিগুলি মুদ্রণ করে! ধন্যবাদ
জেমি

6

থ্যাঙ্কস চাদ! কীটির সাথে সম্পর্কিত সমস্ত ত্রুটিগুলি দেখানোর জন্য, আমি কী নিয়ে এসেছি তা এখানে। কোনও কারণে বেস এইচটিএমএল.ভালিডেশনম্যাসেজ সহায়তা কেবল কীটির সাথে যুক্ত প্রথম ত্রুটি দেখায়।

    <%= Html.ShowAllErrors(mykey) %>

HtmlHelper:

    public static String ShowAllErrors(this HtmlHelper helper, String key) {
        StringBuilder sb = new StringBuilder();
        if (helper.ViewData.ModelState[key] != null) {
            foreach (var e in helper.ViewData.ModelState[key].Errors) {
                TagBuilder div = new TagBuilder("div");
                div.MergeAttribute("class", "field-validation-error");
                div.SetInnerText(e.ErrorMessage);
                sb.Append(div.ToString());
            }
        }
        return sb.ToString();
    }

6

উপরে থেকে বেশ কয়েকটি উত্তর একত্রে রেখে, আমি এটি ব্যবহার করে শেষ করেছি:

var validationErrors = ModelState.Values.Where(E => E.Errors.Count > 0)
    .SelectMany(E => E.Errors)
    .Select(E => E.ErrorMessage)
    .ToList();

validationErrorsList<string>প্রতিটি ত্রুটি বার্তা ধারণ করে এমনটি শেষ হয় । সেখান থেকে, সেই তালিকাটি দিয়ে আপনি যা চান তা করা সহজ।

এখানে চিত্র বর্ণনা লিখুন


2

এখানে ভিবি আছে।

Dim validationErrors As String = String.Join(",", ModelState.Values.Where(Function(E) E.Errors.Count > 0).SelectMany(Function(E) E.Errors).[Select](Function(E) E.ErrorMessage).ToArray())

0

কোন সম্পত্তি কী কারণে ত্রুটি ঘটেছে তা আপনি যদি জানেন না, আপনি প্রতিবিম্ব ব্যবহার করে সমস্ত বৈশিষ্ট্য লুপ করতে পারেন:

public static String ShowAllErrors<T>(this HtmlHelper helper) {
    StringBuilder sb = new StringBuilder();
    Type myType = typeof(T);
    PropertyInfo[] propInfo = myType.GetProperties();

    foreach (PropertyInfo prop in propInfo) {
        foreach (var e in helper.ViewData.ModelState[prop.Name].Errors) {
            TagBuilder div = new TagBuilder("div");
            div.MergeAttribute("class", "field-validation-error");
            div.SetInnerText(e.ErrorMessage);
            sb.Append(div.ToString());
        }
    }
    return sb.ToString();
}

যেখানে টি আপনার "ভিউমোডেল" এর ধরণ।

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