RangeValidator将获取input的value并使用regex验证它。正则表达式的一部分是本地化的十进制字符。
因此,在德国文化中,如果我输入RangeValidator,那么100.00就会失败,但是它会接受100,00,因为,是德国文化的十进制字符。
在新的input[type=number] (asp:TextBox with TextMode="Number")的HTML5上,我可以输入100,00或100.00 (将step属性设置为"0.01“),它将始终保存值100.00。这将导致RangeValidator在德国文化中一直失败。
将位置更改为en-US可以解决问题,但我需要用户区域设置中的应用程序。
不知何故,我可以告诉RangeValidator总是使用.作为十进制字符,或者有更好的方法来处理这种情况吗?
发布于 2016-09-04 23:46:29
所以这是肮脏的,但有效的:
我重写了框架的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" />但是,这太脏了,不是吗?
我真正感到困惑的是,即使我只是在修改客户端脚本时,这也是可行的。服务器端验证接受来自英语文化的值。这真的很奇怪。
发布于 2016-09-02 07:17:01
您可以在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;
}https://stackoverflow.com/questions/39280347
复制相似问题