繁体   English   中英

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

Edit decimal model properties in C# ASP .Net MVC

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个带有一个十进制属性的Simple模型:

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)或者如果我发布1.5我得到服务器端模型验证错误 - "The value '1.5' is not valid for Quantity." 我试图在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);
}

为什么它不适用于应用程序启动?

2 个回复

我认为它在Application_Start不起作用是合乎逻辑的,因为你为每个线程设置了文化。

您可以在web.config中全局设置文化:

<configuration>
    <system.web>
        <globalization uiCulture="en-GB" culture="en-GB" />
    </system.web>
</configuration>

但是如果你想(如你的例子中)拥有俄罗斯文化但使用不同的小数分隔符,那么我认为Application_BeginRequest()可能是一个很好的候选者。 根据文件

当ASP.NET响应请求时,作为HTTP管道执行链中的第一个事件发生。

但是你需要小心,因为这个事件在字面上每个请求都会被触发。

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

我认为这样的功能也可以像这个答案一样移动到过滤器。

有一个关于这个问题的优秀博客文章。 我已经回答了类似的问题

我使用的方法是扩展jQuery验证器。 它基于这篇博文 我将元数据中的文化设置为BE-nl。 由于这是一个纯粹的荷兰网站,我不会进一步检查。

 $(function () { // Look in metatag what culture we want // and set this as culture for the client side. var data = $("meta[name='accept-language']").attr("content"); Globalize.culture(data.toString()); // Don't validate on keyup event because it will mess up // the cursor when replacing values in a textbox. $('form').each(function () { var validator = $(this).data('validator'); if (validator) { validator.settings.onkeyup = false; } }); // Belgianize/sanitize the numbers inserted // 1 000 000 => 1000000 // 1.00 => 1,00 $.validator.methods.number = function (value, element) { var s = value.replace(/\\ /g, '').split('.').join(','); if (s.split(',').length < 3) { var number = Globalize.parseFloat(s); if (!isNaN(number)) { $(element).val(s); return this.optional(element) || true; } } return this.optional(element) || false; }; }); 

我想我使用这个jQuery库进行全球化

1 无法从我的 asp.net 模型中的 db_view 读取十进制值

我正在做这个项目,我正在设计某种地图,我必须存储每个国家/地区的经度和纬度,这意味着它们是十进制的(在我的数据库中)。 我必须按原样读取这些数据 - 使用浮点数,以便我可以将它们导出到 Excel 文件。 我尝试过的: 使用SELECT CAST(DecimalColumn AS int); 但 ...

2 ASP.net/C# SqlDataReader和十进制问题

我正在尝试使用SqlDataReader从MSSQL数据库中将Decimal(10,2)读取为格式字符串,如8.80。 我尝试了几种方法,但总是得到8.00,而不是8.80。 我可以确认数据库中的数据是8.80。 谁能告诉我该怎么做? 谢谢。 编辑:感谢您的时间。 原来 ...

3 ASP.NET/C#十进制为0.00

我有了这种方法,如何将小数设为.00而不是.0000? 更新:很抱歉提出愚蠢的问题。 我看不到将DataFormatString =“ {0:F2}”放在哪里 这是我的网格: ...

4 MVC模型格式十进制数

在SQL Server中,我具有以下字段: 在MVC模型中: 当我添加或编辑价格1.1234时,它将在数据库中保存1.1200。 我想将其保存为1.1234 ...

5 .NET中的十进制

我在.NET中有一个十进制,我需要将其存储到字符串型数据集的一列中。 我需要将小数位存储到两个小数位。 即使我使用Math.Round(value,2)并执行ToString() ,它也不起作用。 任何想法和建议表示赞赏! ...

2011-08-01 21:18:04 5 730   c#
8 如何验证Asp.Net中的十进制数字?

我需要在asp.net中验证一个十进制数字。 我以为要使用RegularExpressionValidator。 如果您还有其他想法,建议我。 该数字必须与numeric(4,1)匹配,因此可接受的值为: 1; 12; 123; 123,1; (不好:1234; 12,3 ...

10 在c#中是十进制和十进制不同?

在c#中如果我使用decimal (小写'd'),IDE会以深蓝色显示(如int )。 如果我使用Decimal (大写'd'),则IDE将其显示为teal(类似于类名)。 在这两种情况下,工具提示都是struct System.Decimal 。 有什么区别吗? 是一个“首选”? ...

2009-12-22 15:27:22 9 1437   c#/ types
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM