2 ضمیمه
صفر شدن مقادیر Decimal و Double در فرم ایجکسی
با سلام
من فرمم ایجکسی هست ، دو نوع متغیر decimal و double دارم
وقتی اعداد بدون ممیز میزنم مثل 33و67و.. خیلی خوب و قشنگ ارسال میشه اما وقتی اعداد ممیزی میزنم متاسفانه 0 می شوند
مشکل چیه؟
ضمیمه 141562
ضمیمه 141563
کلی گشتم Decimal Model Binder رو پیشنهاد دادن که کار نمیکنه
امیدوارم کسی بدونه
ممنون
نقل قول: صفر شدن مقادیر Decimal و Double در فرم ایجکسی
سلام Decimal Model Binder راه اصلیشه ولی اگه با این روش مشکل دارید به نظرم میتونید مقادیر رو به صورت string ارسال کنید و در آخر تبدیلشون کنید به نوع مد نظرتون.
نقل قول: صفر شدن مقادیر Decimal و Double در فرم ایجکسی
درود
اگر به سورس دات نت دقت کنید Decimal.Parse ذاتا Number.Parse را با style پیشفرض Number فراخوانی میکند.
این بخش از سورس دات نت فریم ورک :
[__DynamicallyInvokable]
public static decimal Parse(string s)
{
return Number.ParseDecimal(s, NumberStyles.Number, NumberFormatInfo.CurrentInfo);
}
زمانی که شما یک type converter را از descriptor دریافت میکنید در زمان model binding اتفاقی که رخ میدهد چیست؟
شما در واقع یک Decimal Converter را دریافت میکنید برای Parse کردن مقدار ارسالی
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
// ...
string text = ((string)value).Trim();
if (culture == null)
culture = CultureInfo.CurrentCulture;
NumberFormatInfo formatInfo = (NumberFormatInfo)culture.GetFormat(typeof(NumberF ormatInfo));
return FromString(text, formatInfo);
// ...
}
return base.ConvertFrom(context, culture, value);
}
مشکل از کجا رخ میدهد ؟ Decimal Converter پیاده سازی FromString را با Float بازنویسی میکند
internal override object FromString(string value, NumberFormatInfo formatInfo)
{
return Decimal.Parse(value, NumberStyles.Float, formatInfo);
}
راه حل شما نوشتن یک Convertor اختصاصی میباشد به شکل زیر
class NumericDecimalConverter : DecimalConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
string text = ((string)value).Trim();
if (culture == null)
culture = CultureInfo.CurrentCulture;
NumberFormatInfo formatInfo = (NumberFormatInfo)culture.GetFormat(typeof(NumberF ormatInfo));
return Decimal.Parse(text, NumberStyles.Number, formatInfo);
}
else
{
return base.ConvertFrom(value);
}
}
}
در نهایت در هنگام استارت اپلیکیشن میتوانید نمونه جدید را با قدیمی به کمک Reflection بازنویسی کنید
TypeDescriptor.AddAttributes(typeof(decimal), new TypeConverterAttribute(typeof(NumericDecimalConver ter)));
شاد باشید.
میتوانید من را در linked-in دنبال کنید. اینجا