1. ホーム
  2. c#

ASP.NET Custom Validator クライアントサイドとサーバーサイドのバリデーションが実行されない

2023-10-24 11:58:32

質問

今までこのようなことはありませんでしたが、何らかの理由でクライアント側とサーバー側の両方の検証イベントがトリガーされないのです。

<asp:TextBox ID="TextBoxDTownCity" runat="server" CssClass="contactfield" />
<asp:CustomValidator ID="CustomValidator2" runat="server" EnableClientScript="true"
    ErrorMessage="Delivery Town or City required"
    ClientValidationFunction="TextBoxDTownCityClient" 
    ControlToValidate="TextBoxDTownCity"
    OnServerValidate="TextBoxDTownCity_Validate" Display="Dynamic" >
</asp:CustomValidator>

サーバーサイドの検証イベントです。

protected void TextBoxDTownCity_Validate(object source, ServerValidateEventArgs args)
{
    args.IsValid = false;
}

クライアント側の検証イベント。

function TextBoxDCountyClient(sender, args) {
    args.IsValid = false;
    alert("test");
}

少なくともサーバーサイドの検証は行われると思っていたのですが、そうではありませんでした。 これは本当に困っています。

出力を見てみると、ASP.NETはクライアント側の関数を認識しています。

ASP.NETのJavaScriptの出力です。

var ctl00_ctl00_content_content_CustomValidator2 = document.all ? document.all["ctl00_ctl00_content_content_CustomValidator2"] : document.getElementById("ctl00_ctl00_content_content_CustomValidator2");

ctl00_ctl00_content_content_CustomValidator2.controltovalidate = "ctl00_ctl00_content_content_TextBoxDTownCity";

ctl00_ctl00_content_content_CustomValidator2.errormessage = "Delivery Town or City required";

ctl00_ctl00_content_content_CustomValidator2.display = "Dynamic";

ctl00_ctl00_content_content_CustomValidator2.evaluationfunction = "CustomValidatorEvaluateIsValid";

ctl00_ctl00_content_content_CustomValidator2.clientvalidationfunction = "TextBoxDTownCityClient";

レンダリングされたカスタムバリデータ。

<span id="ctl00_ctl00_content_content_CustomValidator2" style="color:Red;display:none;">Delivery Town or City required</span> 

なぜクライアント側とサーバー側の両方の検証が行われないのか、どなたか教えていただけませんか?

Edit: Typo 私は間違った関数を貼り付けました、問題はまだ同じです。

最後のコメントへのちょうどもう一つの更新:ここでテキストボックスは空にすることはできません。 私はこれをテストし、それは真実ではありません。 空のページで、CustomValidator は値なしで私のクライアント側検証関数をうまく起動しました。

<asp:TextBox ID="TextBox1" runat="server" />
<asp:CustomValidator ID="CustomValidator1" runat="server" 
ErrorMessage="CustomValidator" ClientValidationFunction="TextBoxDAddress1Client"></asp:CustomValidator>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

どのように解決するのですか?

あなたの CustomValidatorTextBox が空でないときのみ発生します。

が空でないことを確認する必要がある場合、そのためには RequiredFieldValidator も必要です。

注意 入力コントロールが空の場合。 検証関数は呼び出されず バリデーションに成功します。入力コントロールが空の場合は RequiredFieldValidator コントロールを使用して 入力コントロールにデータを入力するようユーザーに要求する 入力コントロールにデータを入力するよう要求します。

EDITです。

もし、あなたの CustomValidator で指定された ControlToValidate 属性が指定されている場合 (元の例もそうです)、コントロールが空でないときにのみ検証関数が呼び出されます。

を指定しない場合は ControlToValidate を指定しないと、検証関数が毎回呼び出されることになります。

これは問題に対する2つ目の解決策を開きます。別の RequiredFieldValidator を使うのではなく ControlToValidate 属性から CustomValidator を削除し、検証関数を設定して、次のようにします。

クライアント側のコード(Javascript)。

function TextBoxDCountyClient(sender, args) {
    var v = document.getElementById('<%=TextBoxDTownCity.ClientID%>').value;
    if (v == '') {
        args.IsValid = false;  // field is empty
    }
    else {
        // do your other validation tests here...
    }
}

サーバーサイドのコード(C#)。

protected void TextBoxDTownCity_Validate(
    object source, ServerValidateEventArgs args)
{
    string v = TextBoxDTownCity.Text;
    if (v == string.Empty)
    {
        args.IsValid = false;  // field is empty
    }
    else
    {
        // do your other validation tests here...
    }
}