web-dev-qa-db-ja.com

ASP.NET Custom Validatorクライアント側とサーバー側の検証が起動しない

これは私には以前に起こりませんでしたが、何らかの理由でクライアント側とサーバー側の両方の検証イベントがトリガーされていません:

<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> 

クライアント側とサーバー側の両方の検証が実行されない理由を明らかにすることができますか?.

編集:タイプミス、間違った関数に貼り付けましたが、問題は同じです

最後のコメントの更新:TextBoxを空にすることはできません。私はこれをテストしましたが、それは正しくありません。空白のページで、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" />
70
REA_ANDREW

CustomValidatorは、TextBoxが空でない場合にのみ起動します。

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

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

編集:

CustomValidatorControlToValidate属性を指定している場合(および元の例が指定している場合)、コントロールが空でない場合にのみ検証関数が呼び出されます。

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...
    }
}
112
LukeH

これを使って:

<asp:CustomValidator runat="server" id="vld" ValidateEmptyText="true"/>

空のフィールドを検証します。

2つのバリデーターを追加する必要はありません!

123
Carl Nielsen

クライアント側の検証がWebフォーム上でまったく実行されていなかったため、理由がわかりませんでした。問題は、javascript関数の名前がサーバーコントロールIDと同じであることが判明したことです。

だからあなたはこれを行うことはできません...

<script>
  function vld(sender, args) { args.IsValid = true; }
</script>
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="vld" />

しかし、これは機能します:

<script>
  function validate_vld(sender, args) { args.IsValid = true; }
</script>
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="validate_vld" />

内部の.NET Javascriptと競合していると思いますか?

5
Bill Gates

また、validationgroupプロパティが設定され、明示的に呼び出されない場合、検証が起動しないため、検証グループを使用していないことも確認してください。

 Page.Validate({Insert validation group name here});
3
ori

ポストバックの原因となっているコントロールのCausesValidationがtruに設定されており、検証グループが割り当てられていないことを確認しましたか?

他に何がこの動作を引き起こす可能性があるのか​​わかりません。

3
Daniel

ControlToValidate LukeHに関する情報をありがとう!

私のコードでやろうとしていたことは、テキストフィールドBが特定の値を持っているときに、テキストフィールドAがフィールドにテキストを持っていることだけを確認することでした。それ以外の場合、Aは空白またはその他のいずれかです。マークアップでControlToValidate = "A"を削除すると、問題が解決しました。

乾杯!

0
doddy

クライアント側の検証が無効な場合、サーバー側の検証は実行されず、ポストバックは送信されません。

合格しない他の検証はありませんか?

ClientValidationFunction="TextBoxDTownCityClient"を指定したため、クライアント側の検証は実行されません。検証関数としてTextBoxDTownCityClientという名前の関数が検索されますが、関数名はTextBoxDAddress1Clientである必要があります

(あなたが書いたように)

0
Davide Vosti