ورود

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 بود و این خط به خطا میخورد، یه ریپلیس زدم که اصلاح بشه

روش بهتر کسی میدونه اطلاع رسانی کنه.