0

給与のTextBoxと関連するCompareValidatorがあり、次のように設定されています。

<asp:CompareValidator ... Operator="DataTypeCheck" Type="Currency" />

データベースからフォーマットされた文字列をTextBoxに入力します。

txtSalary.Text = myObject.Salary.ToString("N2")

ユーザーがフランスの文化(fr-caなど)を使用してページにアクセスすると、ToStringメソッドが80 000,00テキストボックスに配置されます。これは問題ありません。

ただし、スペースが含まれている数値があると、バリデーターが失敗します。これは問題ありません。CompareValidatorを米国以外の形式の数値で正しく機能させる方法はありますか?

4

2 に答える 2

2

私はあなたのような問題を抱えていましたが、まったく同じではありませんでした。私は次のような問題を抱えていました。

<asp:RangeValidator ID="rw" ErrorMessage="error" 
    Text="!" ControlToValidate="r" MinimumValue="1 000,00" MaximumValue="1 000 000,00" Type="Currency" CultureInvariantValues="false" runat="server" EnableClientScript="true" />;

コントロールをたとえば2000,00のデータでデータバインドしましたが、検証エラーが発生しました

しかし、私がod 2 000,00の値を入力したとき、すべてがOKでした。

答えはCurrencyGroupSeparatorのスペースでした。私のカルチャpl-plにはスペースがありますが、スペース「\ x0020」ではありませんが、ノーブレークスペース「\00A0」です。

私はリフレクターを使って掘りましたが、私が見つけたのは不可解です

通貨フォーマットチェックは、メソッドprivate static string ConvertCurrency(string text、NumberFormatInfo info)のBaseCompareValidatorクラスにあります。

コードには次のような行があります。

if (currencyGroupSeparator[0] == '\x00a0')
{
    currencyGroupSeparator = " ";
}

逆コンパイルされたコードをテストプロジェクトに入れて実行しようとしましたが、実際にコードが正しく機能していませんでした。

ConvertCurrency(10000000.00m.ToString( "n")、NumberFormatInfo.CurrentInfo)はnullを返しました。

なぜ誰かがそこに置いたのかはわかりませんが、コメントしたところ、メソッドは正常に動作し始めました。

まだソースから.netFrameworkをコンパイルできないので、区切り文字をノーブレークスペースからスペースに変更することができます。

したがって、私たちの問題の解決策は次のとおりです。

Thread.CurrentThread.CurrentCulture = new CultureInfo( "いくつかのカルチャ名"); Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyGroupSeparator = "\ x0020"; Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator = "\ x0020";

于 2011-05-02T01:37:25.660 に答える
0

CompareValidatorとRangeValidatorのバグだと思います-おそらくクライアント側のJavaScriptにあります。

サーバー側に次のコードを使用して(クライアント側にコードを使用せずに)CustomValidatorに変更することで、問題を修正しました。

Protected Sub ValidateSalary(ByVal sender As Object, _ 
                             ByVal e As ServerValidateEventArgs)
    Try
        If txtSalary.Text <> String.Empty Then
            Dim salary As Decimal = Convert.ToDecimal(txtSalary.Text, _ 
                Thread.CurrentThread.CurrentUICulture)
        End If

        e.IsValid = True
    Catch ex As Exception
        e.IsValid = False
    End Try
End Sub
于 2010-10-15T16:52:38.403 に答える