0

これが取引です。テキストボックスに入力がある場合にのみ起動するカスタムバリデーターを作成しました。起動すると、ボックス内のテキストが整数であるかどうかをテストする必要があり、整数でない場合は拒否されます。しかし、それは発火しません、そして私はその理由を理解しようとしています。

私はこのvoidを部分的なc#クラスの本体に入れました:

    protected void intValidate_Validate(object sender, ServerValidateEventArgs arg)
    {
        int num;
        bool isNum = int.TryParse(arg.ToString(), out num);

        if(arg.Value.Length>0){
            if (isNum)
             {
                arg.IsValid = true;
             }
             else
             {
                arg.IsValid = false;
             }
        }
        else{
            arg.IsValid=true;
        }
    }

バリデーターのコードは次のとおりです。

 <div class="adult">
            <label>Adults ($10)</label>
            <asp:TextBox runat="server" ID="wAdultLunch" class="adultLunch" MaxLength="2" />
            <asp:CustomValidator ID="intValidate" ControlToValidate="wAdultLunch" ErrorMessage="Invalid number" OnServerValidate="intValidate_Validate" Display="Static" runat="server" EnableClientScript="False" ValidateEmptyText="True"></asp:CustomValidator>
 </div>

洞察をいただければ幸いです。

編集:私は以下のポストバックコードを添付しました

<asp:Button ID="wSubmit" runat="server" Text="Submit" OnClientClick="return validateForm();" causesvalidation="true"/>
4

4 に答える 4

2

あなたは間違ったことで解析を行っています。 あなたが実際にしたいときに、arg.ToString()あなたにの文字列を与えます(これはすでに文字列です)"System.Web.UI.WebControls.ServerValidateEventArgs"arg.Value

だから、代わりに...

bool isNum = int.TryParse(arg.ToString(), out num);

に変更します(に注意してください.Value)。。。

bool isNum = int.TryParse(arg.Value, out num);

実際に必要なものよりもはるかに複雑ですが。全体をこのようにもっと包括的に書き直すことができます...

protected void intValidate_Validate(object sender, ServerValidateEventArgs arg)
{
    int num;
    arg.IsValid = int.TryParse(are.Value, out num);
}

これは、TryParseが変換が成功した場合はtrueを返し、それ以外の場合はfalseを返すためです。

<asp:RequiredFieldValidator ...>そして最後の考えとして、これはすべて、<asp:CompareValidator Operator="DataTypeCheck" Type="Integer" ...>および<asp:RangeValidator ...>バリデーターコントロールを使用して実現できます。


アップデート

OPが指摘しているように、テキストボックスが空のときにエラーが発生することを望まないので、代わりにこれを試してください...

protected void intValidate_Validate(object sender, ServerValidateEventArgs arg)
{
    if (args.Value.Length > 0)
    {
        int num;
        arg.IsValid = int.TryParse(are.Value, out num);
    }
    else
    {
        arg.IsValid = true;
    }
}

そして、@ HansKestingによってすでに指摘されています...これは、すべてのクライアント側の検証に合格した場合にのみ呼び出されます。クライアント側の検証が失敗するとすぐに、サーバーへのフォームの送信もキャンセルされます。

于 2012-08-01T13:24:52.073 に答える
2

関連するかどうかはわかりませんが、カスタムバリデーターが起動しないという問題がありました。空の文字列のデフォルト値を持つドロップダウンリストを検証しました。私は設定しなければなりませんでした

ValidateEmptyString="true" 

それからそれはうまく働き始めました。

Validate()関数を呼び出して、カスタムバリデーターコントロールからIsValidプロパティを読み取ることもできます。ただし、ページの検証関数は正常に機能するはずであり、そのような呼び出しは必要ありません。

于 2013-02-03T18:29:20.303 に答える
0

検証に合格した場合に実行するサーバー側のイベントがあると思います。例:ボタンクリックイベント。その中で、Page.IsValidをチェックすると、検証に合格するとfalseになり、Page.IsValidはtrueになります。検証に合格したかどうかを確認するには、Page.IsValidを使用する必要があります。

于 2012-07-31T21:00:29.710 に答える
0

フロントエンドで、以下に示すように、CausesValidation属性をtrueに設定してみてください。それが役立つかどうかを確認してください。

<asp:Button ID="btnSubmit" Text="Submit" CausesValidation="true" runat="server" />
于 2012-07-31T21:45:55.843 に答える