gpt4 book ai didi

c# - ASP.NET Core 本地化小数字段点和逗号

转载 作者:行者123 更新时间:2023-12-02 07:22:55 25 4
gpt4 key购买 nike

我有一个本地化的 ASP.NET Core Web 应用程序:en-US 和 it-IT。

在 en-US 中,小数分隔符是点,在 it-IT 中,小数分隔符是逗号。

我有这个 ViewModel

public class MyViewModel 
{
public int Id {get; set; }

// Omitted

public decimal? Amount{get; set;}

}

对于当我在 en-US html 文本框渲染上渲染创建/编辑页面时的小数字段

1000.00

如果我发布表单,操作就会完成且不会出现错误。

到目前为止一切顺利。

当我在 it-IT 上呈现创建/编辑页面时,html 文本框呈现

1000,00 (notice the comma)

如果我尝试发布表单,(客户端)验证失败并显示

The field Amount must be a number.

我读到了有关 IModelBinder 的内容,但我知道它是用于在将表单发布到服务器上时映射 viewModel,就我而言,我被客户端验证阻止了。

最好是在 en-US 时使用点,在 it-IT 时使用逗号,但仅使用点也可以

最佳答案

深入挖掘问题后,我找到了两个解决方案:

来自Stephen Muecke的评论其中解释如何将所需的 jquery 添加到 validation for comma and dot 的输入中

自定义InputTagHelper,将逗号转换为点。这里我只添加了小数类型,但显然你可以添加 float 和 double。

[HtmlTargetElement("input", Attributes = ForAttributeName, TagStructure = TagStructure.WithoutEndTag)]
public class InvariantDecimalTagHelper : InputTagHelper
{
private const string ForAttributeName = "asp-for";

private IHtmlGenerator _generator;

[HtmlAttributeName("asp-is-invariant")]
public bool IsInvariant { set; get; }

public InvariantDecimalTagHelper(IHtmlGenerator generator) : base(generator)
{
_generator = generator;
}

public override void Process(TagHelperContext context, TagHelperOutput output)
{
base.Process(context, output);

if (IsInvariant && output.TagName == "input" && For.Model != null && For.Model.GetType() == typeof(decimal))
{
decimal value = (decimal)(For.Model);
var invariantValue = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
output.Attributes.SetAttribute(new TagHelperAttribute("value", invariantValue));
}
}
}

要使用第二个解决方案,您只需将 asp-is-invariant 添加到您的输入中,如下所示

 <input asp-for="AmountSw" class="form-control" asp-is-invariant="true" />

关于c# - ASP.NET Core 本地化小数字段点和逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45881119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com