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



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

因此,在德国文化中,如果我输入100.00, RangeValidator将失败,但是它会接受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" />

但是,这太脏了,不是吗?…

当重写涉及客户端验证机制的JS函数时,请注意UpdatePanels的问题,比如这个

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

相关内容

  • 没有找到相关文章

最新更新