PDA

View Full Version : سوال: صفر شدن مقادیر Decimal و Double در فرم ایجکسی



_Memol_
دوشنبه 28 تیر 1395, 22:38 عصر
با سلام
من فرمم ایجکسی هست ، دو نوع متغیر decimal و double دارم
وقتی اعداد بدون ممیز میزنم مثل 33و67و.. خیلی خوب و قشنگ ارسال میشه اما وقتی اعداد ممیزی میزنم متاسفانه 0 می شوند
مشکل چیه؟
141562
141563
کلی گشتم Decimal Model Binder رو پیشنهاد دادن که کار نمیکنه
امیدوارم کسی بدونه
ممنون

bomb23
سه شنبه 29 تیر 1395, 08:22 صبح
سلام Decimal Model Binder راه اصلیشه ولی اگه با این روش مشکل دارید به نظرم میتونید مقادیر رو به صورت string ارسال کنید و در آخر تبدیلشون کنید به نوع مد نظرتون.

مهران موسوی
چهارشنبه 30 تیر 1395, 00:59 صبح
درود

اگر به سورس دات نت دقت کنید 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 دنبال کنید. اینجا (http://linkedin.com/in/mehran-mousavi)