如何使 "number" 类型输入的 RangeValidator 在所有本地化中工作?

How to make the RangeValidator on an input of type "number" work in all localizations?

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

因此,在德国文化中,如果我输入 100.00RangeValidator 将失败,但它会接受 100,00,因为 , 是德国文化。

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

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

我能否以某种方式告诉 RangeValidator 始终使用 . 作为十进制字符,或者是否有更好的方法来处理这种情况?

您可以在 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" />

但是,这很脏,不是吗? ...

点赞这个

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