এএসপি.নেট এমভিসি মডেলস্টেট থেকে সমস্ত ত্রুটিগুলি কীভাবে পাবেন?


452

আমি মূল মানগুলি না জেনে মডেল স্টেট থেকে সমস্ত ত্রুটি বার্তা পেতে চাই। মডেলস্টেটে থাকা সমস্ত ত্রুটি বার্তাগুলি ধরতে লুপিং

কিভাবে আমি এটি করতে পারব?


5
যদি আপনি কেবল ত্রুটিগুলি প্রদর্শন করে থাকেন তবে @Html.ValidationSummary()তা সমস্তকে রেজারে প্রদর্শন করার একটি দ্রুত উপায়।
লেভিনিঞ্জ

11
foreach (var error in ViewData.ModelState.Values.SelectMany(modelState => modelState.Errors)) { DoSomething(error); }
রাজ্জান ডুমিত্রু

উত্তর:


529
foreach (ModelState modelState in ViewData.ModelState.Values) {
    foreach (ModelError error in modelState.Errors) {
        DoSomethingWith(error);
    }
}

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


22
খুব উপকারী. কিছু পরিস্থিতিতে যেমন নমনীয় ব্যর্থতা এবং খারাপ অনুরোধগুলির মধ্যে নোট করুন, সেখানে খালি স্ট্রিং সহ মডেলস্টেটের এন্ট্রি থাকবে Value.ErrorMessageএবং তার পরিবর্তে একটিValue.Exception.Message
অ্যারোনলএস

5
ত্রুটিগুলি দুর্দান্ত তবে কখনও কখনও আপনি মডেলস্টেটের চাবিটিও (অর্থাত্ ক্ষেত্রের নাম) চান। আপনি যে পেতে পারেন এই প্রথম লাইন পরিবর্তন করে: foreach (KeyValuePair<string, ModelState> kvp in htmlHelper.ViewData.ModelState) {এবং এটি নিচে এই লাইন ঢোকান: var modelState = kvp.Value;। আপনি চাবিটি পেতে পারেনkvp.Key
স্নিগ্ধতা

531

লিনকিউ ব্যবহার :

IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);

68
কেবল ত্রুটি বার্তা সহ আইনুনামেবল <স্ট্রিং> ফিরিয়ে দিতে পরিবর্তন করা হয়েছে :: var allErferences = ModelState.Values.SelectMany (v => v.Erferences.Select (b => b.ErrorMessage));
কিয়েরান

6
এটি দুর্দান্ত, তবে দুর্ভাগ্যক্রমে ওয়াচ / তাত্ক্ষণিক উইন্ডোজগুলি
ল্যাম্বদা'র

3
হ্যাঁ! আমার (আপনারা, যে কেউ) "সিস্টেম.লিনক ব্যবহার করে" দরকার; উপরে. অন্যথায় আপনি বার্তাটি পেয়েছেন 'মানগুলিতে অনেকের জন্য সংজ্ঞা থাকে না'। এটি আমার ক্ষেত্রে অনুপস্থিত ছিল।
এস্তেভেজ

2
নরকে কেন ভার ব্যবহার করছে ?????? আপনি কি তার পরিবর্তে `আইনিউনারেবল <মডেলএরর> 'লিখতে পারেননি ???
হাকান ফস্টেক

6
@ হাকাম-ফস্টোক @ জেবি06 আপনি উভয়ই ঠিক আছেন। টাইপ করার List<string> errors = new List<string>()পরিবর্তে var errors = new List<string>()সত্যিই সময় নষ্ট হয়, কিন্তু লেখার IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);, যেখানে রিটার্ন টাইপ সত্যিই, স্পষ্ট নয় সত্যিই পাঠযোগ্যতা মেয়াদে বেশী। (এমনকি যদি ভিজ্যুয়াল স্টুডিও আপনাকে তা মাউস
হওয়ারে

192

আপনি যদি সমস্ত ত্রুটি বার্তাগুলিকে একটি স্ট্রিংয়ে যোগ দিতে চান তবে লিনকুই ভেরিসনে নির্মাণ করছেন:

string messages = string.Join("; ", ModelState.Values
                                        .SelectMany(x => x.Errors)
                                        .Select(x => x.ErrorMessage));

5
অন্য বিকল্পটি নিম্নলিখিতটি করা হয়: ModelState.Values.SelectMany (x => x.Erferences) .Select (x => x.ErrorMessage) .জাইনস্ট্রিং (";");
টড থমসন

3
@ টড, আইইনামেবল? জয়নস্ট্রিং () আপনার নিজস্ব এক্সটেনশন পদ্ধতি? দেখুন stackoverflow.com/q/4382034/188926
Dunc

2
আরে ডান্ক - হ্যাঁ আমি সন্দেহ করি যে আমি আমার কোড বেসে সেই এক্সটেনশন পদ্ধতিটি যুক্ত করেছি এবং এটি সম্পর্কে ভুলে গিয়েছি এবং তারপরে ভেবেছিলাম এটি একটি কাঠামোর পদ্ধতি LOL :(
টড থমসন

5
বা ... মডেলস্টেট.ভ্যালুস.সিলিটম্যানি (O => O.Erferences)। নির্বাচন করুন (O => O.ErrorMessage)। সমষ্টি ((ইউ, ভি) => ইউ + "," + ভি)

2
আপনি যখন ওয়েব এপিআই ব্যবহার করছেন এবং আইএইচটিপিএ্যাকশনআরসাল্টের ফলাফলটি ফিরিয়ে দিচ্ছেন তখন এটি দুর্দান্ত কাজ করে। সুতরাং, আপনি কেবল এটি করতে পারেন: BadRequest (বার্তা) ফিরিয়ে দিন; ধন্যবাদ, ডানক!
ধনী ওয়ার্ড

32

আমি সামান্য লিনকিউ ব্যবহার করে এটি করতে সক্ষম হয়েছি,

public static List<string> GetErrorListFromModelState
                                              (ModelStateDictionary modelState)
{
      var query = from state in modelState.Values
                  from error in state.Errors
                  select error.ErrorMessage;

      var errorList = query.ToList();
      return errorList;
}

উপরের পদ্ধতিটি বৈধতা ত্রুটির একটি তালিকা প্রদান করে।

আরও পড়া :

এএসপি.এনইটি এমভিসিতে মডেলস্টেট থেকে সমস্ত ত্রুটি কীভাবে পড়বেন


17

ডিবাগিংয়ের সময় মডেলস্টেটের সমস্ত ত্রুটিগুলি দেখানোর জন্য আমার প্রতিটি পৃষ্ঠার নীচে একটি টেবিল স্থাপন করা দরকারী বলে মনে করি।

<table class="model-state">
    @foreach (var item in ViewContext.ViewData.ModelState) 
    {
        if (item.Value.Errors.Any())
        { 
        <tr>
            <td><b>@item.Key</b></td>
            <td>@((item.Value == null || item.Value.Value == null) ? "<null>" : item.Value.Value.RawValue)</td>
            <td>@(string.Join("; ", item.Value.Errors.Select(x => x.ErrorMessage)))</td>
        </tr>
        }
    }
</table>

<style>
    table.model-state
    {
        border-color: #600;
        border-width: 0 0 1px 1px;
        border-style: solid;
        border-collapse: collapse;
        font-size: .8em;
        font-family: arial;
    }

    table.model-state td
    {
        border-color: #600;
        border-width: 1px 1px 0 0;
        border-style: solid;
        margin: 0;
        padding: .25em .75em;
        background-color: #FFC;
    }
 </style>

এখানে যদি কোনও প্রান্তের কেস এখানে ব্যর্থ হয় তবে দয়া করে ঠিক করার জন্য উত্তরটি সম্পাদনা করুন
সাইমন_উইভার

12

আমি এখনও অবধি দেওয়া উত্তরের পরামর্শ অনুসরণ করে আবিষ্কার করেছি, আপনি ত্রুটি বার্তাগুলি সেট না করেই ব্যতিক্রম ঘটতে পারেন, সুতরাং সমস্যাটি সমাধান করার জন্য আপনাকে অবশ্যই ত্রুটিমাখা এবং ব্যতিক্রম উভয়ই পেতে হবে।

String messages = String.Join(Environment.NewLine, ModelState.Values.SelectMany(v => v.Errors)
                                                           .Select( v => v.ErrorMessage + " " + v.Exception));

বা এক্সটেনশন পদ্ধতি হিসাবে

public static IEnumerable<String> GetErrors(this ModelStateDictionary modelState)
{
      return modelState.Values.SelectMany(v => v.Errors)
                              .Select( v => v.ErrorMessage + " " + v.Exception).ToList();

}

আপনি এর মধ্যে সমস্ত ত্রুটিযুক্ত স্ট্রিং চান কেন? আপনি যখন দর্শনে এটির সাথে কিছু করতে চান তখন কোনও অর্থ হয় না, তালিকার একটি অ্যারেটি আরও ভাল ইমো
ড্যানিয়েল টিউল্প

1
ডিবাগ করতে। আমার অ্যাপ্লিকেশনটিতে কী ভুল হচ্ছে তা সন্ধান করা আমার প্রথম সমস্যা ছিল। আমি কী ভুল হচ্ছে তা কেবল ব্যবহারকারীকে জানার চেষ্টা করছিলাম না। স্ট্রিংয়ের একটি অঙ্ক তৈরি করা থেকে শুরু করে অন্য কোনও কিছুর একটি গণনা হিসাবে রূপান্তর করা তুচ্ছ এটি উদাহরণস্বরূপ ত্রুটি বার্তা এবং ব্যতিক্রম তাই সত্যিকারের দরকারী জিনিসটি আপনার উভয় বিটের তথ্য প্রয়োজন তা জেনে রাখা হচ্ছে
অ্যালান ম্যাকডোনাল্ড

বিটিডব্লিউ আপনি কী বুঝতে পেরেছিলেন দ্বিতীয় এক্সটেনশন পদ্ধতিটি আয়করনীয় <স্ট্রিং> এবং কেবল একটি বড় একক স্ট্রিংই দেয় না?
অ্যালান ম্যাকডোনাল্ড

8

যদি কেউ তীব্র বার্তাটি দৃ strongly়ভাবে টাইপ করা দৃষ্টিতে আবদ্ধ করার জন্য মডেল সম্পত্তিটির নাম ফিরিয়ে দিতে চায়।

List<ErrorResult> Errors = new List<ErrorResult>();
foreach (KeyValuePair<string, ModelState> modelStateDD in ViewData.ModelState)
{
    string key = modelStateDD.Key;
    ModelState modelState = modelStateDD.Value;

    foreach (ModelError error in modelState.Errors)
    {
        ErrorResult er = new ErrorResult();
        er.ErrorMessage = error.ErrorMessage;
        er.Field = key;
        Errors.Add(er);
    }
}

এইভাবে আপনি ক্ষেত্রের সাথে ত্রুটিটি আসলে বেঁধে রাখতে পারেন যা ত্রুটিটি ছুঁড়ে ফেলেছে।


7

কেবল ত্রুটি বার্তাগুলি আউটপুট করা আমার পক্ষে যথেষ্ট ছিল না, তবে এটি কৌশলটি করেছে।

var modelQuery = (from kvp in ModelState
                  let field = kvp.Key
                  let state = kvp.Value
                  where state.Errors.Count > 0
                  let val = state.Value?.AttemptedValue ?? "[NULL]"

                  let errors = string.Join(";", state.Errors.Select(err => err.ErrorMessage))
                  select string.Format("{0}:[{1}] (ERRORS: {2})", field, val, errors));

Trace.WriteLine(string.Join(Environment.NewLine, modelQuery));

1
একটি সতর্কতা হিসাবে, মডেলস্টেটের মূল মান জোড়গুলি নুল মান অন্তর্ভুক্ত করতে পারে, এ কারণেই এখানে মূল কোডটিতে একটি নাল কোলেস অপারেটর (?।) সহ কিছু বুদ্ধিমান সি # 6 ব্যবসায় অন্তর্ভুক্ত রয়েছে, তাই কারিটি ?? এক্সপ্রেশন শেষে। নাল ত্রুটিগুলি থেকে রক্ষা করা উচিত এমন আসল অভিব্যক্তিটি ছিল: state.Value.?AtemptedValue ?? "[খালি]". যতদূর আমি জানি, কোডটি তার বর্তমান অবস্থায়, যেখানে স্টেটস.ভ্যালু == নাল, ঝুঁকির মধ্যে রয়েছে এমন পরিস্থিতিগুলির স্নেহময় পরিচালনা ছাড়া its
জোশ সটারফিল্ড

5

যদি কারও কারও প্রয়োজন হয় তবে আমি আমার প্রকল্পগুলিতে নিম্নলিখিত স্ট্যাটিক ক্লাসটি তৈরি এবং ব্যবহার করি

ব্যবহারের উদাহরণ:

if (!ModelState.IsValid)
{
    var errors = ModelState.GetModelErrors();
    return Json(new { errors });
}

Usings:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using WebGrease.Css.Extensions;

ক্লাস:

public static class ModelStateErrorHandler
{
    /// <summary>
    /// Returns a Key/Value pair with all the errors in the model
    /// according to the data annotation properties.
    /// </summary>
    /// <param name="errDictionary"></param>
    /// <returns>
    /// Key: Name of the property
    /// Value: The error message returned from data annotation
    /// </returns>
    public static Dictionary<string, string> GetModelErrors(this ModelStateDictionary errDictionary)
    {
        var errors = new Dictionary<string, string>();
        errDictionary.Where(k => k.Value.Errors.Count > 0).ForEach(i =>
        {
            var er = string.Join(", ", i.Value.Errors.Select(e => e.ErrorMessage).ToArray());
            errors.Add(i.Key, er);
        });
        return errors;
    }

    public static string StringifyModelErrors(this ModelStateDictionary errDictionary)
    {
        var errorsBuilder = new StringBuilder();
        var errors = errDictionary.GetModelErrors();
        errors.ForEach(key => errorsBuilder.AppendFormat("{0}: {1} -", key.Key,key.Value));
        return errorsBuilder.ToString();
    }
}

ধন্যবাদ কোডআর্টিস্ট !! আমি এর প্রয়োগের নীচে কোডে একটি ছোট পরিবর্তন করেছি।
আলফ্রেড সেভেরো

4

এবং এটিও কাজ করে:

var query = from state in ModelState.Values
    from error in state.Errors
    select error.ErrorMessage;
var errors = query.ToArray(); // ToList() and so on...

@ ইয়াসার আপনি কি টোটোর উত্তর দেখেছেন?
মাফিন ম্যান

@ মফিনম্যান হ্যাঁ আমার আছে। এটা কেমন ?
ইয়াসের শায়খ

@ ইয়াসার এটি সেরা উত্তর। এটির সাথে কোনওটিই ভুল নয়, তবে যখন SelectManyউপলব্ধ থাকে তখন এটি ব্যবহার করার কোনও অর্থ নেই ।
মাফিন ম্যান

4

ত্রুটি বার্তাগুলির অ্যারেটি দেখার জন্য দরকারী, সম্ভবত জসনের মাধ্যমে:

messageArray = this.ViewData.ModelState.Values.SelectMany(modelState => modelState.Errors, (modelState, error) => error.ErrorMessage).ToArray();

4

এটি @ ডানকের উত্তর থেকে প্রসারিত হচ্ছে। এক্সএমএল ডক মন্তব্য দেখুন

// ReSharper disable CheckNamespace
using System.Linq;
using System.Web.Mvc;


public static class Debugg
{
    /// <summary>
    /// This class is for debugging ModelState errors either in the quick watch 
    /// window or the immediate window.
    /// When the model state contains dozens and dozens of properties, 
    /// it is impossible to inspect why a model state is invalid.
    /// This method will pull up the errors
    /// </summary>
    /// <param name="modelState">modelState</param>
    /// <returns></returns>
    public static ModelError[]  It(ModelStateDictionary modelState)
    {
        var errors = modelState.Values.SelectMany(x => x.Errors).ToArray();
        return errors;            
    }
}

3

এছাড়াও, ModelState.Values.ErrorMessageখালি থাকতে পারে, তবে ModelState.Values.Exception.Messageএকটি ত্রুটি নির্দেশ করতে পারে ।


0

আপনার প্রয়োগে আপনি স্থির শ্রেণি হারিয়েছেন, এটি হওয়া উচিত।

if (!ModelState.IsValid)
{
    var errors =  ModelStateErrorHandler.GetModelErrors(this.ModelState);
    return Json(new { errors });
}

বরং

if (!ModelState.IsValid)
{
    var errors = ModelState.GetModelErrors();
    return Json(new { errors });
}

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