【问题标题】:RegularExpressionValidator VS Ajax 1.0.20229正则表达式验证器 VS Ajax 1.0.20229
【发布时间】:2011-03-22 08:37:38
【问题描述】:

我们有一个运行.NET Framework 2.0Ajax version 10618 的网站。

但事实上,这是 dll 的旧版本,因此我们计划将其切换到 .NET Framework 2.0AjaxControlToolkit version 20229 的“最新”版本。

在我们的测试中,我们检测到 ASP 控件 RegularExpressionValidator 存在问题,该控件过去在旧版本中运行良好。

只要目标控件的输入与验证不匹配,控件就会显示我的 文本,在本例中是一个红色星号,位于下一行中,并在控件中显示以下内容:"-1.7976931348623157e+308"

表达式没有任何问题,因为正如我所说,它适用于旧版本的 Ajax,但我找不到与 RegularExpressionValidatorsAjax 版本相关的任何内容。

PS:验证器和控件都在 UpdatePanel 中。

PS 2:对于旧版本,它会在控件中放置一个 0,然后在表达式不匹配时显示它旁边的红色星号。

编辑:

这是控件,完全复制:

<asp:RegularExpressionValidator ID="ValidateFooOrder" 
runat="server" ControlToValidate="txtFooNum"                                                    
Text="*" ErrorMessage="Invalid Foo number" 
ValidationExpression="^\d{0,4}$" ValidationGroup="GenerateFooFile" />

它还附加了一个NumericUpAndDownExtender

<ajaxToolkit:NumericUpDownExtender ID="NumericExtenderFooNum" 
runat="server" TargetControlID="txtFooNum"                                                    
TargetButtonDownID="FooBack" TargetButtonUpID="FooForward" />

【问题讨论】:

  • 我知道这是一个老问题,但如果您仍然遇到问题:您可以发布您的设计器代码吗?看看它是否是控件处理正则表达式或编写 javacript 方式的变化会很有趣。
  • @Patricker 好的,添加了代码。抱歉,拖了很久。
  • 我假设问题仍然存在,因为您更新了您的问题,对吧?
  • @Patricker 是的,它仍在发生。在考虑到我们必须通过切换 Ajax 版本来解决一些小问题后,我们最终根本没有更新它。
  • @Cyborgx37 哦,我在另一条评论上写错了。我的意思是它不是特定于供应商的控制。那我就加个ajaxtoolkit标签吧。

标签: asp.net vb.net asp.net-ajax reg-expressionvalidator


【解决方案1】:

好的,我遇到了同样的问题,这是我的发现:

首先是-1.7976931348623157E+308的来源。它等于AjaxControlToolkit.NumericUpDownBehaviorMinimum 属性,在Sys.Application.init Event 处理程序之一中调用:

Sys.Application.add_init(function() {
    $create(AjaxControlToolkit.NumericUpDownBehavior, {"Maximum":1.7976931348623157E+308,"Minimum":-1.7976931348623157E+308, /* other non relevant stuff */);
});

所以,这里没有魔法,只是Double 的最小值。 Minimum 是与版本 10618 相比的新属性。

接下来,为什么页面一显示就显示呢?发生这种情况是因为在AjaxControlToolkit.NumericUpDownBehavior.prototype 中定义的readValue 函数内部,如果输入为空,则将值this._min(等于来自$createMinimum 参数)分配给输入。 readValue 来源:

readValue : function() {
        /// <summary>
        /// Parse value of textbox and this._currentValue to be that value.
        /// this._currentValue = this._min if some there is an exception
        /// when attempting to parse.
        /// Parse int or string element of RefValues
        /// </summary>

        if (this._elementTextBox) {
            var v = this._elementTextBox.value;
// The _currentValue of NumericUpDown is calculated here 
            // if textbox empty this._currentValue = this._min
            if(!this._refValuesValue) {
                if(!v) {
                    this._currentValue = this._min;
                } else {
                    try {
                        this._currentValue = parseFloat(v);
                    } catch(ex) {
                        this._currentValue = this._min;
                    }
                }
                if(isNaN(this._currentValue)) {
                    this._currentValue = this._min;
                }
// And assigned here. In case of empty input we will get -1.7976931348623157E+308 if Minimum was not changed
                this.setCurrentToTextBox(this._currentValue);
                this._valuePrecision = this._computePrecision(this._currentValue);
            } else {
                if(!v) {
                    this._currentValue = 0;
                } else {
                    var find = 0;
                    for (var i = 0; i < this._refValuesValue.length; i++) {
                        if (v.toLowerCase() == this._refValuesValue[i].toLowerCase()) {
                            find = i;
                        }
                    }
                    this._currentValue = find;
                }
                this.setCurrentToTextBox(this._refValuesValue[this._currentValue]);
            }
        }
    }

Minimum 之前的版本10618 中,默认值为0。所以我认为可以通过在扩展器声明中明确指定Minimum 值来解决所描述的问题:

<ajaxToolkit:NumericUpDownExtender ID="NumericExtenderFooNum" runat="server" 
     Minimum="0"
     TargetControlID="txtFooNum"
     TargetButtonDownID="FooBack" TargetButtonUpID

我发现的另一件事是change 事件分派在新版本的 IE 中工作错误(要使其正常工作,应该启用兼容性视图,但我认为这不是公共网站的选项)。

问题出在setCurrentToTextBox 函数中。如果使用document.createEvent 创建,event 对象在处理程序(例如验证处理程序)中始终为null。要解决此问题,应交换条件,以便 IE 中的所有事件都将使用createEventObject 创建。

// Current implementation of version 20229
setCurrentToTextBox : function(value) {
            // full sources are not shown, only if matters here

            if (document.createEvent) {
                // event is created using createEvent
            } else if( document.createEventObject ) {
                // event is created using createEventObject 
            }
        }
    }

// Updated implementation
setCurrentToTextBox : function(value) {
            // full sources are not shown, only if matters here

            if (document.createEventObject) {
                // event is created using createEventObject 
            } else if(document.createEvent) {
                // event is created using createEvent
            }
        }
    }

【讨论】:

    【解决方案2】:

    查看错误消息,意味着正在测试的数字超出了表达式的边界。唯一允许的数字介于 0 和 9999 之间。不允许使用字母、标点符号或其他字符。表达式的另一部分在数字周围断言锚点,作为行或单词的开头和结尾。唯一允许的其他值是 NULL,这可能是更新更严格并给出错误的地方。例如,如何验证不存在的数字或数字“\d”(零字符)?

    【讨论】:

    • 我的假设(这些是否允许?)是大多数更新版本的任何东西都会修复错误。将验证定义为数字,但允许该值为 NULL 是一个错误。验证 1 到 4 位数字的正确正则表达式是 "^\d{1,4}$" 而不是 0,4。
    • 那是-1,因为我不同意某事吗?我的回答是针对正则表达式错误的,这在任何语言中都是错误的,而不仅仅是 AJAX。 -1 是不合理的,也是没有根据的。
    • 您的回答只是猜测,甚至没有解决为什么 AJAX 升级会改变旧版 ASP.NET 控件的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多