0

テキストボックスが 3 列あるグリッドビューがあります。必要な数の行を持つことができますが、通常は約 5 行しかありません。各行を検証する必要があります。

2 つの列を合計し、それを 3 番目の列と比較して、ユーザーがデータを正しく入力したことを確認するクライアント側バリデーターを作成したいと考えています。

ご参考までに、コード ビハインドで前の 2 つの列を単純に合計するのではなく、オペレーターが 3 番目の列を入力する必要があるのは仕様の一部です。これは、オペレーターが情報を正しく転記していることを確認するために行われます。

このクライアント側の検証を作成するために、.net でカスタム バリデータを使用しようとしています。しかし、3 つのテキスト ボックスの名前を渡す方法が見つかりません。ControlToValidate パラメーターを使用してターゲット コントロール名を指定できますが、他の 2 つのコントロール ID を渡すにはどうすればよいですか?

これを行うための「適切な」方法を探しています。1 つの考えは、controltovalidate の名前で参照される JavaScript で配列を作成することです。

DC

4

1 に答える 1

0

問題を解決しました。エレガントなソリューションではありませんが、機能します。

最初にコードをページの div に配置しました

<div align="right"><asp:CustomValidator ID="RowValidator" runat="server"
ErrorMessage="Total of #total# does not equal 1st Preference + Ticket"
ControlToValidate="Total" ValidateEmptyText="True" 
ClientValidationFunction="CheckRow" SetFocusOnError="True" EnableClientScript="True"
enableViewState="False" Display="Dynamic"></asp:CustomValidator></div>

次に、JavaScript関数を作成しました...

function CheckRow(sender,args) {
// get the name of the control to validate
try {
    args.IsValid = true;
    ctv = sender.controltovalidate;

// get the data from the other controls
    nt = document.getElementById(ctv.replace('_Total','_NonTicket'));
    t = document.getElementById(ctv.replace('_Total','_Ticket'));

    if (nt && t) {
        v1 = Number(nt.value);
        v2 = Number(t.value);
        v3 = Number(args.Value);
        if ((v1 + v2) != v3){
            msg = GetMessage(sender);
            sender.innerHTML = msg.replace("#total#",Number(args.Value));
            args.IsValid = false;
            return false;
        }
   }
}
catch (e) {
    // something wrong default to server side validation
}
return true;
}

これは、送信者のcontroltovalidateパラメーターを使用して名前を取得する行ごとにカスタムバリデーターによって呼び出されます

次に、他のフィールドの名前を取得するための少しの文字列操作の問題です。

取得したら、好きなことを行うことができます。私の場合は、追加して比較します。エラーが発生した場合、Isvalid フラグがクリアされ、メッセージが適切に変更されます。

メッセージを変更してより意味のあるエラー メッセージを表示するため、getmessage 関数が必要です。

/*
get the error message from the validator
store it so it can be retrieved again
this is done because the message is altered
*/
function GetMessage(sender){        

msg = window[sender.id+"_msg"];
if (!msg){
    msg = sender.innerHTML;
    window[sender.id+"_msg"] = msg;
}
return msg;
}

getmessage 関数は元のメッセージのコピーを保持するため、ユーザーが 2 回以上間違いを犯した場合は、元の形式でメッセージを取得できます。それ以外の場合は、最初にメッセージを編集するときにプレースホルダー (#total#) を上書きします。

DC

于 2010-02-10T02:33:23.553 に答える