في 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 عبر هذا الرابط
بالتوفيق