在C#ASP .Net MVC中编辑十进制模型属性
作者:互联网
我有一个带有十进制属性的简单模型:
public class Model {
public decimal Quantity { get;set; }
}
我认为我有:
@Html.TextBoxFor(m => m.Quantity)
@Html.ValidationMessageFor(m => m.Quantity)
问题是,当我尝试使用小数部分(例如1.5、2.5等)发布值时,我或客户端会收到验证错误,具体取决于我使用的NumberDecimalSeparator.如果我发布1,5,我得到客户端验证错误(数据值一),或者如果我发布1.5,我得到服务器端模型验证错误-“值’1.5’对数量无效.”.我试图在Global.asax中的Application_Start()上手动设置NumberDecimalSeparator,但没有帮助.
var currentCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
currentCulture.NumberFormat.NumberDecimalSeparator = ".";
Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentCulture;
当我手动向数据库中添加一些值并尝试对其进行编辑时,TextBox中的值显示为点“.”,但是当我尝试使用该点保存另一个值时,出现服务器端验证错误.可能是什么原因?为什么手动文化信息更新不起作用?
//编辑:
我更改currentCulture.NumberFormat.NumberDecimalSeparator的方法有效,但是仅当我每次在Application_BeginRequest()上都这样做时:
protected override void Application_BeginRequest(object sender, System.EventArgs e)
{
var currentCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
currentCulture.NumberFormat.NumberDecimalSeparator = ".";
currentCulture.NumberFormat.NumberGroupSeparator = " ";
currentCulture.NumberFormat.CurrencyDecimalSeparator = ".";
Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentCulture;
base.Application_BeginRequest(sender, e);
}
为什么在应用程序启动时不起作用?
解决方法:
我认为在Application_Start中不起作用是合乎逻辑的,因为您为每个线程设置了区域性.
您可以在web.config中全局设置区域性:
<configuration>
<system.web>
<globalization uiCulture="en-GB" culture="en-GB" />
</system.web>
</configuration>
但是,如果您希望(如您的示例所示)具有俄罗斯文化但使用不同的小数点分隔符,那么我认为Application_BeginRequest()可能是一个不错的选择.根据documentation:
Occurs as the first event in the HTTP pipeline chain of execution when
ASP.NET responds to a request.
但是您需要小心,因为实际上每个请求都会触发此事件.
我不久前解决了类似的问题.在我的情况下,用户可以在文化之间进行切换.因此,每个用户区域性都保存在数据库中,因此,我们使用了控制器的Initialize方法而不是Application_BeginRequest().然后,我们根据当前的线程文化设置所有用于客户端验证的规则.
我认为此类功能也可以像this answer中一样移动到过滤器中.
标签:decimal-point,validation,c,asp-net-mvc 来源: https://codeday.me/bug/20191028/1952995.html