74

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

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

クライアント側とサーバー側の両方の検証が起動しない理由について、誰かが光を当てることができますか?

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

最後のコメントへのもう 1 つの更新: 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" />
4

7 に答える 7

133

これを使って:

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

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

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

于 2010-08-25T11:05:06.510 に答える
114

が空でないCustomValidator場合にのみ発火します。TextBox

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

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

編集:

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

指定しない場合ControlToValidate、検証関数が毎回呼び出されます。

これにより、問題に対する 2 番目の可能な解決策が開かれます。別の を使用するのではなく、から属性をRequiredFieldValidator省略し、次のようなことを行うように検証関数を設定できます。ControlToValidateCustomValidator

クライアント側コード (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...
    }
}
于 2009-03-31T14:02:38.257 に答える
5

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と競合していると思いますか?

于 2009-04-15T21:56:09.707 に答える
3

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

他に何がこの動作を引き起こすのかわかりません。

于 2009-03-31T13:49:41.280 に答える
3

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

 Page.Validate({Insert validation group name here});
于 2009-05-18T12:54:47.217 に答える
0

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

私がコードでやろうとしていたのは、テキスト フィールド B に特定の値がある場合に、テキスト フィールド A にテキストが含まれるようにすることだけでした。それ以外の場合、A は空白でも何でもかまいません。マークアップで ControlToValidate="A" を取り除くと、問題が解決しました。

乾杯!

于 2012-01-19T17:03:49.103 に答える
0

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

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

指定したため、クライアント側の検証は実行されません。これにより、検証関数として 名前がClientValidationFunction="TextBoxDTownCityClient"付けられた関数が検索されますが、関数名はTextBoxDTownCityClientTextBoxDAddress1Client

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

于 2009-03-31T13:50:57.847 に答える