.NET

حل مشكلة The value is not valid for XXXX.

في ASP.NET Core إذا قمت بربط النموذج Model من نوع Decimal or float or double مع واجهة المعراض View مباشرة أو عبر ViewModel سيظهر لك خطأ The value is not valid for ، وهي عدم إمكانية إرسال القيمة المدخلة من المعراض View إلى النموذج Model، وتظهر عند محاولتك إرسال أرقام كسرية فقط، أما الأرقام الصحيحة فتعمل بكفاءة، ولا تظهر في الأغلب حين تكون لغة المسار Thread إنجليزية أو لغة متناسقة مع الصيغة المعيارية.

سبب المشكلة هو صيغة النص والفاصلة بين الرقم الصحيح وكسره، ولحل هذه المشكلة، يجب أن نقوم بإرسال حاشية البيانات DataAnnotations في النموذج لتوضيح وتخصيص صيغة النص المدخل.

الخطوة الأولى هي إنشاء فئة Class كما في الكود التالي:

using Microsoft.AspNetCore.Mvc.ModelBinding;
using System.Globalization;
using System.Threading.Tasks;

public class DecimalModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext
            .ValueProvider
            .GetValue(bindingContext.ModelName);

        var cultureInfo = new CultureInfo("en");

        decimal.TryParse(
            valueProviderResult.FirstValue,
            NumberStyles.AllowDecimalPoint,
            cultureInfo,
            out var model);

        bindingContext
            .ModelState
            .SetModelValue(bindingContext.ModelName, valueProviderResult);

        bindingContext.Result = ModelBindingResult.Success(model);
        return Task.CompletedTask;
    }
}

ثم تقوم باستدعائها كحاشية توصيفية للبيانات في نموذج المعراض ViewModel

        [ModelBinder(BinderType = typeof(DecimalModelBinder))]
        public decimal Price { get; set; }

من الواضح أن المشكلة في قراءة البيانات من المعراض لذلك لا داعي لإضافة هذا التوصيف في النموذج Model فقط نكتفي في نموذج المعراض ViewModel

هناك طريقة أخرى لحل هذه المشكلة عن طريق jquery عبر هذا الرابط

بالتوفيق

About the author

خليل سليم

Leave a Comment

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.