c# - 在 C# ASP .Net MVC 中编辑十进制模型属性

标签 c# asp.net-mvc validation decimal-point

我有一个具有一位小数属性的简单模型:

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 我会收到客户端验证错误(第一个 data-val-number)或者如果我发布 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.

但是您需要小心,因为这个事件实际上是在每个 请求时触发的。

不久前我解决了类似的问题。在我的例子中,用户有可能在文化之间切换。所以每个用户文化都保存在数据库中,因此我们使用 Controller 的 Initialize 方法而不是 Application_BeginRequest()。然后我们根据当前线程文化设置所有客户端验证规则。

我认为这样的功能也可以像 this answer 中那样移动到过滤器中.

关于c# - 在 C# ASP .Net MVC 中编辑十进制模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29361594/

相关文章:

javascript - 单击按钮时调用 MVC Controller 和操作方法

C# Control.Focus() 和 Control.Select() 有什么区别

c# - 使用应用程序池凭据发送电子邮件

c# - 在非异步方法中同步等待任务完成,但任务永远是 WaitingForActivation

c# - 在 JustMock 中找不到 TestFixtureSetUpAttribute?

c# - 是否可能有 2 个 View 与一个操作相关联?

c# - 当我使用 .net 图表在页面上显示图片时,它只显示一个页面

javascript - 使用 jQuery 验证具有通用规则的表单

c# - 如何在自定义验证属性中获取/注入(inject)服务

javascript - 用户名检查不适用于具有多个寄存器模型 (mvc) 的表单