Asp.net 如何在类型为“的输入上创建RangeValidator”;“数字”;在所有地方工作?

Asp.net 如何在类型为“的输入上创建RangeValidator”;“数字”;在所有地方工作?,asp.net,html,webforms,rangevalidator,Asp.net,Html,Webforms,Rangevalidator,RangeValidator将获取输入的值,并使用regex对其进行验证。正则表达式的一部分是本地化的十进制字符 因此,在德国文化中,如果我输入100.00,则RangeValidator将失败,但它将接受100,00,因为,是德国文化的十进制字符 在HTML5新的input[type=number](asp:TextBox和TextMode=“number”)上,我可以输入100,00或100.00(步骤属性设置为“0.01”)并且它将始终保持值100.00。这将导致RangeValidato

RangeValidator
将获取
输入的
,并使用regex对其进行验证。正则表达式的一部分是本地化的十进制字符

因此,在德国文化中,如果我输入
100.00
,则
RangeValidator
将失败,但它将接受
100,00
,因为
是德国文化的十进制字符

在HTML5新的
input[type=number]
asp:TextBox
TextMode=“number”
)上,我可以输入
100,00
100.00
(步骤
属性设置为“0.01”)并且它将始终保持值
100.00
。这将导致
RangeValidator
在德国文化中一直失败

将位置更改为
en-US
可以解决问题,但我需要用户区域设置中的应用程序


不知何故,我可以告诉
RangeValidator
始终使用
作为十进制字符,或者有更好的方法来处理这种情况吗?

您可以在
页面上设置特定的数字格式设置,并在不更改整个UI语言的情况下更改十进制分隔符

    protected void Page_PreInit(object sender, EventArgs e)
    {
        CultureInfo newCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
        NumberFormatInfo numberFormat = (NumberFormatInfo)newCulture.NumberFormat.Clone();
        numberFormat.NumberDecimalDigits = 2;
        numberFormat.NumberDecimalSeparator = ".";
        newCulture.NumberFormat = numberFormat;
        System.Threading.Thread.CurrentThread.CurrentCulture = newCulture;
    }

您可以在
Page_PreInit
上设置特定的数字格式设置,并在不更改整个UI语言的情况下更改小数分隔符

    protected void Page_PreInit(object sender, EventArgs e)
    {
        CultureInfo newCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
        NumberFormatInfo numberFormat = (NumberFormatInfo)newCulture.NumberFormat.Clone();
        numberFormat.NumberDecimalDigits = 2;
        numberFormat.NumberDecimalSeparator = ".";
        newCulture.NumberFormat = numberFormat;
        System.Threading.Thread.CurrentThread.CurrentCulture = newCulture;
    }

所以这是肮脏的,但有效:

我已经覆盖了框架的
ValidatorValidate
功能:

function ValidatorValidate(val, validationGroup, event) {
    // new code: 
    if (typeof (val.customized) == "undefined") {
        var data = $(val).data();
        for (var key in data) {
            val[key] = data[key];
        }
        val.customized = true;
    }

    // this code was copied from the framework:
    val.isvalid = true;
    if ((typeof (val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {
        if (typeof (val.evaluationfunction) == "function") {
            val.isvalid = val.evaluationfunction(val);
            if (!val.isvalid && Page_InvalidControlToBeFocused == null &&
                    typeof (val.focusOnError) == "string" && val.focusOnError == "t") {
                ValidatorSetFocus(val, event);
            }
        }
    }
    ValidatorUpdateDisplay(val);
}
现在,我可以使用数据属性在验证器上强制特定的JS变量。要强制
RangeValidator
使用
en-US
区域设置,我只需强制它从ASPX标记中将
decimalchar
设置为
并将
digits
设置为
2

<asp:RangeValidator ID="rv" runat="server" Data-DecimalChar="." Data-Digits="2" MinimumValue="-100" MaximumValue="100" ControlToValidate="tb" Type="Currency" />
,就像这个。


我真正感到困惑的是,即使我只是修改客户端脚本,这种方法仍然有效。服务器端验证接受来自英国文化的值。这真的很奇怪。

所以这是肮脏的,但有效:

我已经覆盖了框架的
ValidatorValidate
功能:

function ValidatorValidate(val, validationGroup, event) {
    // new code: 
    if (typeof (val.customized) == "undefined") {
        var data = $(val).data();
        for (var key in data) {
            val[key] = data[key];
        }
        val.customized = true;
    }

    // this code was copied from the framework:
    val.isvalid = true;
    if ((typeof (val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {
        if (typeof (val.evaluationfunction) == "function") {
            val.isvalid = val.evaluationfunction(val);
            if (!val.isvalid && Page_InvalidControlToBeFocused == null &&
                    typeof (val.focusOnError) == "string" && val.focusOnError == "t") {
                ValidatorSetFocus(val, event);
            }
        }
    }
    ValidatorUpdateDisplay(val);
}
现在,我可以使用数据属性在验证器上强制特定的JS变量。要强制
RangeValidator
使用
en-US
区域设置,我只需强制它从ASPX标记中将
decimalchar
设置为
并将
digits
设置为
2

<asp:RangeValidator ID="rv" runat="server" Data-DecimalChar="." Data-Digits="2" MinimumValue="-100" MaximumValue="100" ControlToValidate="tb" Type="Currency" />
,就像这个。


我真正感到困惑的是,即使我只是修改客户端脚本,这种方法仍然有效。服务器端验证接受来自英语文化的值。这真的很奇怪。

尝试过,但无法重现问题(荷兰uiCulture)。
输入[type=number]
将只保存整数,并且在输入“,”或“.”时将变为红色。但是
RangeValidator
会正常工作。
@VDWWD Sry,忘记提及。将输入的
步骤
属性设置为“0.01”使其能够输入浮动值。然后问题将出现。尝试了它,但无法再现问题(荷兰uiCulture)。输入[type=number]
将只保存整数,并且在输入“,”或“.”时将变为红色。但是
RangeValidator
会正常工作。
@VDWWD Sry,忘记提及。将输入的
步骤
属性设置为“0.01”若要使其能够输入浮动值,则会出现问题。我知道我可以这样做,但这不是一个好步骤,因为在网站的其他部分,我只想在本地化标签中显示数字。替换当前区域性的
NumberDecimalSeparator
,将导致我的所有数字显示为
ecimal分隔符。它将是每页,而不是整个项目。但是新输入的数字分隔符使用浏览器语言本地化,而不是网站上的本地化。因此,让它们一起工作可能非常困难。我正在寻找对步进器验证功能的覆盖,但它可能在“但是新输入的数字分隔符使用了浏览器语言本地化”-我的浏览器使用的是德语区域设置,但它仍然使用点。如果它不同的话,那将是一个可怕的混乱。(-在我的德语本地化Google Chrome/Firefox中,按下按钮将返回“1.22”)“这将是每页,而不是整个项目。"-我知道,但在同一页上,我显示了需要正确本地化小数分隔符的其他值。我知道我可以这样做,但这不是一个好的步骤,因为在网站的其他部分,我只想在本地化标签中显示数字。替换当前区域性的
NumberDecimalSeparator
,将导致我所有的错误使用
作为十进制分隔符显示的数字。它将是每页,而不是整个项目。但是新输入的数字分隔符使用浏览器语言本地化,而不是网站上的本地化。因此,可能很难让它们一起工作。我正在寻找验证函数的覆盖“但是新输入的数字分隔符使用了浏览器语言本地化”-我的浏览器使用的是德语区域设置,它仍然使用点。如果它不一样,那将是一个可怕的混乱。(-按下按钮将返回“1.22”在我的德语本地化Google Chrome/Firefox中--“它将是每页,而不是整个项目。”-我知道,但在同一页上,我显示了其他需要正确本地化小数分隔符的值。