如何使 "number" 类型输入的 RangeValidator 在所有本地化中工作?
How to make the RangeValidator on an input of type "number" work in all localizations?
RangeValidator
将获取 input
的 value
并使用正则表达式对其进行验证。正则表达式的一部分是本地化的十进制字符。
因此,在德国文化中,如果我输入 100.00
,RangeValidator
将失败,但它会接受 100,00
,因为 ,
是德国文化。
在HTML5的新input[type=number]
(asp:TextBox
与TextMode="Number"
)上,我可以输入100,00
或100.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" />
但是,这很脏,不是吗? ...
请点赞这个
我真正感到困惑的是这有效,即使我只是修改客户端脚本。服务器端验证接受来自英语文化的值。这真是奇怪。
RangeValidator
将获取 input
的 value
并使用正则表达式对其进行验证。正则表达式的一部分是本地化的十进制字符。
因此,在德国文化中,如果我输入 100.00
,RangeValidator
将失败,但它会接受 100,00
,因为 ,
是德国文化。
在HTML5的新input[type=number]
(asp:TextBox
与TextMode="Number"
)上,我可以输入100,00
或100.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" />
但是,这很脏,不是吗? ...
请
我真正感到困惑的是这有效,即使我只是修改客户端脚本。服务器端验证接受来自英语文化的值。这真是奇怪。