View Full Version : دریافت مقدار صفر برای مقادیر اعشاری در کنترلر
resident
شنبه 30 بهمن 1395, 14:59 عصر
سلام. وقت بخیر
من تو view برنامم، یه فیلد دارم که نوعش float هست. وقتی مقدار اعشاری مثلا 2.5 رو بهش میدم و دکمه ذخیره رو میزنم، مقدار این فیلد در کنترلر 0.0 میاد.
چطور میشه رفعش کرد؟
public float Tax { get; set; }
@Html.TextBoxFor(model => model.Tax, new { @class = "form-control text-center", lang = "en" })
اگر مقدار فیلد رو عدد صحیح وارد کنم (مثلا 9) مشکلی نداره اما با اعشار مشکل داره
Moien Tajik
شنبه 30 بهمن 1395, 22:51 عصر
از double استفاده کنید : http://stackoverflow.com/a/4681503/6661314
resident
یک شنبه 01 اسفند 1395, 11:08 صبح
از double استفاده کنید : http://stackoverflow.com/a/4681503/6661314
با دابل هم دقیقا همین وضعیت رو داره
مشکلش چیه به نظرتون؟
Moien Tajik
یک شنبه 01 اسفند 1395, 16:13 عصر
اگر امکانش هست کد کنترلرتون رو قرار بدید .
resident
دوشنبه 02 اسفند 1395, 12:39 عصر
اگر امکانش هست کد کنترلرتون رو قرار بدید .
MyModel:
public float Tax { get; set; }
ویو:
@Html.TextBoxFor(model => model.Tax, new { @class = "form-control text-center", lang = "en" })
کنترلر:
[HttpPost]
public ActionResult Create(MyModel entity)
{
RepositoryObject.Insert(entity);
}
تو کنترلر کد خاصی نیست.
Moien Tajik
دوشنبه 02 اسفند 1395, 20:19 عصر
https://forums.asp.net/t/2047713.aspx?float+DataFormatString+comes+back+to+ controller+as+0
resident
سه شنبه 03 اسفند 1395, 16:50 عصر
https://forums.asp.net/t/2047713.aspx?float+DataFormatString+comes+back+to+ controller+as+0
ممنون از توضیحتون
ولی متاسفانه متوجه نشدم چکار باید کنم.
امکانش هست بیشتر راهنماییم کنید؟
Moien Tajik
سه شنبه 03 اسفند 1395, 21:45 عصر
از این Model Binder داخل پروژتون استفاده کنید :
public class DecimalModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var valueResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
var modelState = new ModelState { Value = valueResult };
object actualValue = null;
try {
actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
}
catch (FormatException e) {
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.Model Name, modelState);
return actualValue;
}
}
و در Global.asax :
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
bindingContext.ValueProvider.GetValue به طور پیشفرض Integer برمیگردونه و شما با استفاده از این Model Binder اون رو به Decimal تغییر میدید.
این مطلب + کامنت هاش رو به دقت بخونید ، متوجه مشکل میشید : http://stackoverflow.com/a/33711121/6661314
resident
سه شنبه 03 اسفند 1395, 22:55 عصر
از این Model Binder داخل پروژتون استفاده کنید :
public class DecimalModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var valueResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
var modelState = new ModelState { Value = valueResult };
object actualValue = null;
try {
actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
}
catch (FormatException e) {
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.Model Name, modelState);
return actualValue;
}
}
و در Global.asax :
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
bindingContext.ValueProvider.GetValue به طور پیشفرض Integer برمیگردونه و شما با استفاده از این Model Binder اون رو به Decimal تغییر میدید.
این مطلب + کامنت هاش رو به دقت بخونید ، متوجه مشکل میشید : http://stackoverflow.com/a/33711121/6661314
از اینکه با صبر و حوصله جواب میدید ممنونم/
من این کار رو انجام داده بودم. Model Binder ام رو با Model Binder شما عوض کردم اما یاز هم تغییری حاصل نشد
resident
چهارشنبه 04 اسفند 1395, 19:31 عصر
trace کردم
روی کد Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture) خطا میده.
valueResult.AttemptedValue مقدار داره اما کل فانکشن خطا میده.
یه سوال دیگه این برای decimal هست. برای float و double چکار کنم؟
Moien Tajik
چهارشنبه 04 اسفند 1395, 20:55 عصر
احتمالا در کدتون مشکلی هست چون چندجا با این کد دیدم که مشکل رفع شده ، عینا با این جلو برید ( خواندن کامنت ها فراموش نشه ) : http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx/
یه سوال دیگه این برای decimal هست. برای float و double چکار کنم؟
جای استفاده از Convert.ToDecimal از Convert.ToDouble و Convert.ToSingle استفاده کنید.
resident
پنج شنبه 05 اسفند 1395, 22:48 عصر
احتمالا در کدتون مشکلی هست چون چندجا با این کد دیدم که مشکل رفع شده ، عینا با این جلو برید ( خواندن کامنت ها فراموش نشه ) : http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx/
جای استفاده از Convert.ToDecimal از Convert.ToDouble و Convert.ToSingle استفاده کنید.
ممنون با کامنت ها درست شد.
از راهنمایی هاتون تشکر میکنم
moslem.hady
یک شنبه 10 اردیبهشت 1396, 09:47 صبح
از این Model Binder داخل پروژتون استفاده کنید :
public class DecimalModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var valueResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
var modelState = new ModelState { Value = valueResult };
object actualValue = null;
try {
actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
}
catch (FormatException e) {
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.Model Name, modelState);
return actualValue;
}
}
و در Global.asax :
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
bindingContext.ValueProvider.GetValue به طور پیشفرض Integer برمیگردونه و شما با استفاده از این Model Binder اون رو به Decimal تغییر میدید.
این مطلب + کامنت هاش رو به دقت بخونید ، متوجه مشکل میشید : http://stackoverflow.com/a/33711121/6661314
برای دوستانی که ممکنه در آینده به این مشکل بخوردن، من مشکل رو با کد بالا و با یه تغییر کوچیک موقتا اصلاح کردم.:
actualValue = Convert.ToDecimal(valueResult.AttemptedValue.Repla ce("/","."), CultureInfo.CurrentCulture);
چون عدد پست شده بصورت 123/45 بود و این خط به خطا میخورد، یه ریپلیس زدم که اصلاح بشه
روش بهتر کسی میدونه اطلاع رسانی کنه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.