我有一个本地化的 ASP.NET Core Web 应用程序:en-US 和 it-IT。
在 en-US 中,小数分隔符是点,在 it-IT 中,小数分隔符是逗号。
我有这个视图模型
public class MyViewModel
{
public int Id {get; set; }
// Omitted
public decimal? Amount{get; set;}
}
对于我在上呈现创建/编辑页面时的小数字段en-UShtml 文本框渲染
1000.00
如果我发布表单,则操作完成且没有错误。
到目前为止,一切都很好。
当我渲染创建/编辑页面时it-IThtml 文本框渲染
1000,00(注意逗号)
如果我尝试发布表单,(客户端)验证fail with
字段金额必须是数字。
我读到了有关 IModelBinder 的内容,但我知道它是用于在将表单发布到服务器上时映射 viewModel,就我而言,我被客户端验证阻止了。
更好的是在 en-US 时使用点,在 it-IT 时使用逗号,但仅使用点也可以
深入挖掘问题后,我找到了两个解决方案:
评论来自史蒂芬·穆克其中解释如何将所需的 jquery 添加到 a 的输入验证逗号和点
自定义 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" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)