视图模型十进制转换为带有法语逗号的千



我有以下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>

最新更新