我有以下MVC ViewModel:
public class Payment
{
[Required]
[Range(5, 1000)]
public decimal RebillAmount { get; set; }
}
当我使用以下方法将应用程序语言切换为加拿大法语时:
var cultureInfo = new CultureInfo("fr-CA");
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
然后在输入字段中提交带有300,00
的小数,在控制器中检索值时,小数点的值将转换为30000
?
例如:
public ActionResult Save(Payment model)
{
decimal amount = model.RebillAmount; // <- Returns 30000, not 300.00
}
我做错了什么?
编辑:
区域性是为测试手动设置的(如上所示(,但实际上每个用户都可以使用会话变量进行配置。
您需要编写自定义模型绑定程序才能执行此操作。
public class DecimalModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
ValueProviderResult valueResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
ModelState 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.ModelName, modelState);
return actualValue;
}
}
在 Global.asax 文件中,将以下内容添加到Application_Start方法
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
我在纬度和经度数据方面遇到了类似的问题,逗号由于客户端格式而消失,我解决了这样做:
启动配置
IList<CultureInfo> supportedCultures = new[]
{
new CultureInfo("en-US"),
};
IList<CultureInfo> supportedCulturesUI = new[]
{
new CultureInfo("es-EC"),
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-US"),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// UI strings that we have localized.
SupportedUICultures = supportedCulturesUI
});
波科类
[Column(TypeName = "decimal(18, 6)")]
[DisplayFormat(DataFormatString = "{0:0.000000}", ApplyFormatInEditMode = true)]
public virtual decimal baLatitude { get; set; }
纬度和经度数据由谷歌地图 API 捕获,并写入视图中的隐藏控件中
<div class="is-hidden">
<input asp-for="baLatitude">
</div>