RangeValidator
将获取input
的value
并使用regex验证它。正则表达式的一部分是本地化的十进制字符。
因此,在德国文化中,如果我输入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" />
但是,这太脏了,不是吗?…
当重写涉及客户端验证机制的JS函数时,请注意UpdatePanels的问题,比如这个
我真正困惑的是,这是有效的,即使我只是修改客户端脚本。服务器端验证接受来自英语文化的值。