编程语言
首页 > 编程语言> > 在C#ASP .Net MVC中编辑十进制模型属性

在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