কিভাবে ASP.Net MVC ModelState থেকে সমস্ত ত্রুটি পেতে?




asp.net-mvc (10)

আমি মূল মান বুদ্ধিমান ছাড়া ModelState এর সব ত্রুটি বার্তা পেতে চাই। ModelState ধারণকারী সমস্ত ত্রুটি বার্তা দখল মাধ্যমে looping।

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


LINQ verison এ বিল্ডিং, যদি আপনি সমস্ত ত্রুটি বার্তা এক স্ট্রিংয়ে যোগ দিতে চান:

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

আমি একটু LINQ ব্যবহার করে এটি করতে সক্ষম ছিলাম,

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;
}

উপরের পদ্ধতি যাচাইয়ের ত্রুটি একটি তালিকা প্রদান করে।

আরও পড়া :

কিভাবে ASP.NET MVC এ ModelState থেকে সমস্ত ত্রুটি পড়তে


উপরন্তু, ModelState.Values.ErrorMessage খালি হতে পারে, কিন্তু ModelState.Values.Exception.Message একটি ত্রুটি নির্দেশ করতে পারে।


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

// 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;            
    }
}

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

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

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

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

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

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

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();
    }
}

যদি কোনও দৃঢ় টাইপ ভিউতে ত্রুটির বার্তাটি বন্ধ করার জন্য মডেল সম্পত্তির নামটি ফেরত দিতে চায়।

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

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


LINQ ব্যবহার করে:

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

আপনার বাস্তবায়ন আপনি স্ট্যাটিক ক্লাস অনুপস্থিত, এই হতে হবে।

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

বরং

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






modelstate