14

.NET Framework 2.0で実行されるWebサイトがありAjax version 10618ます。

しかし、それは古いバージョンのdllであるため、「最新」バージョンのdllに切り替えることを計画しまし.NET Framework 2.0AjaxControlToolkit version 20229

RegularExpressionValidatorテストでは、以前のバージョンでは正常に機能していたASPコントロールに問題が検出されました。

ターゲットコントロールへの入力が検証と一致しない場合は常に、コントロールにテキストが表示されます。この場合、次の行のように赤いアスタリスクが配置され、コントロールに次のように表示されます"-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" />
4

2 に答える 2

2

わかりました、私は同じ問題を抱えています。ここに私の発見があります:

まずはソースです-1.7976931348623157E+308。これは、 Sys.Application.init イベントハンドラーの 1 つで呼び出されるMinimumプロパティと同じです。AjaxControlToolkit.NumericUpDownBehavior

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

したがって、ここには魔法はなく、最小値がDouble. Minimumバージョン 10618 と比較して新しいプロパティです。

次に、ページが表示されるとすぐに表示されるのはなぜですか? これは、値( のパラメーターと等しい) で定義されている内部readValue関数が空の場合に入力に割り当てられるために発生します。ソース:AjaxControlToolkit.NumericUpDownBehavior.prototypethis._minMinimum$createreadValue

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 では、デフォルト値は でした0Minimumしたがって、エクステンダー宣言で値を明示的に指定することで、説明されている問題を解決できると思います。

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

私が発見したもう 1 つのことはchange、新しいバージョンの IE ではイベント ディスパッチが正しく動作しないことです (動作させるには、互換表示を有効にする必要がありますが、これは公開 Web サイトのオプションではないと思います)。

問題はsetCurrentToTextBox機能にあります。eventobject は、 document.createEventnullを使用して作成された場合、常にハンドラー (検証ハンドラーなど) にあります。この問題を解決するには、条件を交換して、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
            }
        }
    }
于 2013-05-04T15:30:45.530 に答える
-1

エラー メッセージを見ると、テストされている数値が式の境界の外にあることがわかります。使用できる数字は 0 ~ 9999 のみです。文字、句読点、その他の文字は使用できません。式の他の部分は、行または単語の先頭と末尾のいずれかとして、数値の周囲にアンカーをアサートします。他に許可されている唯一の値は NULL です。これはおそらく、更新がより厳密になり、エラーが発生する場所です。たとえば、存在しない (ゼロ文字) 数字または数字 "\d" をどのように検証しますか?

于 2013-04-08T23:51:40.467 に答える