18

[パスワード] および [パスワードの確認] テキスト ボックスを含む Web フォームがあります。最初のものにはRegularExpressionValidatorが、2番目のものにはCompareValidatorが接続されています。問題は、パスワードフィールドに何かがあり、パスワードの確認フィールドに何もない場合、フィールドが一致しないというエラーが表示されないことです。パスワードの確認フィールドに何かを入力するとすぐに、エラーが表示されます。また、両方のフィールドを空白のままにすることも許可したいと思います。

.NET 2.0 を使用しています

それは何でしょうか?

4

7 に答える 7

18

パスワード ボックスを ControlToValidate に、パスワードの確認ボックスを ControlToCompare にすると、パスワード ボックスに何かが含まれているため、検証が実行されます。

もちろん、これにより、空のパスワード ボックスと入力済みの確認ボックスを含むフォームを送信できるため、必要なバリデータを両方に配置することをお勧めします。

于 2008-11-06T07:59:31.800 に答える
6

私はまったく同じ問題を抱えていました。CompareValidatorの代わりにCustomValidatorを使用してください。(CustomValidatorにはValidateEmptyTextという便利な属性がありますが、少なくともASP.NET 2.0ではCompareValidatorにはありません。)

適切なServerValidate関数とClientValidationFunctionをプログラムする必要があります。javascript関数の関数シグネチャは、基本的にServerValidate関数の場合と同じです:source(object)、args(ServerValidateEventArgs)。

最も難しい部分は、「CompareTo」テキストボックスにアクセスするためのカスタムコードを作成する必要があることです。これは、CustomValidatorの一部ではないためです。私のフィールドはFormView内にありました。特定の状況に合わせてコードを調整する必要がある場合があります。以下のコードでは、「fv」はそのFormViewの名前です。

クライアント側の検証:

<script type="text/javascript">
<!--
  function cvPasswordRpt_Validate(source, args)
  {
    args.IsValid = (args.Value ==
                    document.getElementsByName("fv$tbPassword").item(0).value);
  }
//-->
</script>

ASPXコード:

<label>New Password:</label>
<asp:TextBox ID="tbPassword" runat="server" CssClass="stdTextField" 
             TextMode="Password" ValidationGroup="edit" />
<br />
<label>Repeat New Password:</label>
<asp:TextBox ID="tbPasswordRpt" runat="server" CssClass="stdTextField"
             TextMode="Password" ValidationGroup="edit" />
<asp:CustomValidator ID="cvPasswordRpt" runat="server" Display="Dynamic"
             EnableClientScript="true" ValidationGroup="edit"
             ControlToValidate="tbPasswordRpt" ValidateEmptyText="true"
             ErrorMessage="Your passwords do not match."
             ClientValidationFunction="cvPasswordRpt_Validate"
             OnServerValidate="cvPasswordRpt_ServerValidate" />

サーバー側の検証(VB.NET):

Protected Sub cvPasswordRpt_ServerValidate(ByVal sender As Object, 
                                           ByVal e As ServerValidateEventArgs)
  Dim _newPassword As String = DirectCast(fv.FindControl("tbPassword"), 
                                          TextBox).Text
  e.IsValid = e.Value.Equals(_newPassword)
End Sub
于 2009-06-26T22:39:08.257 に答える
5

RequiredFieldValidator も使用する必要があります。フィールドが空の場合、多くの検証コントロールがパスし、このように RequiredFieldValidator と組み合わせる必要があります。

于 2008-11-06T07:45:12.093 に答える
3

これはどう?

2 つの TextBox フィールド - txtEmail1 (電子メール アドレス用) と txtEmail2 (確認用)。

RegularExpressionValidator を txtEmail1 にアタッチします -- 空白の場合、起動しません。入力すると、データが検証されます。

CompareValidator を txtEmail1 にアタッチし、そのデータを txtEmail2 と比較します。次に、CompareValidator を txtEmail2 に添付し、そのデータを txtEmail1 と比較します。

  • 両方のフィールドが空白の場合、3 つのバリデータはいずれも起動しません。
  • txtEmail1 が入力されると、正規表現と一致する必要があり、txtEmail2 と一致する必要があります。
  • txtEmail2 が設定されている場合、txtEmail1 と一致する必要があります

これは、フィールドを空白のままにできるという要件を満たしていますが、いずれかのフィールドにデータがある場合は検証ロジックを起動します。

-- ジョー

于 2009-03-09T16:13:09.607 に答える
0

私は同じ問題を抱えていて、patmortechの答えを試してみましたが、うまくいきましたが、ユーザーが確認テキストボックスに入力する前に比較バリデーターが表示されるため(クライアント側の検証を使用している場合)、完全ではありません。

代わりに、パスワード ボックスに何かが入力されている場合にのみ比較を行うカスタム バリデータを作成しました。以下のコードは、同じ問題を調べているときにこれに遭遇した他の人に役立つ場合に備えて. 要件に応じて、[パスワード] ボックスの必須フィールド バリデータの有無にかかわらず、このバリデータを使用します。

public class CompareIfRequiredPasswordValidator : BaseValidator
{
    private const string SCRIPTBLOCK = "UNIQUE1";

    private string controlToCompare;

    [Browsable(true)]
    [Category("Behavior")]
    [DefaultValue("")]
    [IDReferenceProperty]
    public string ControlToCompare
    {
        get { return controlToCompare; }
        set { controlToCompare = value; }
    }

    /// <summary>
    /// Server side validation function
    /// </summary>
    /// <returns></returns>
    protected override bool EvaluateIsValid()
    {
        TextBox txCompare = (TextBox)FindControl(ControlToValidate);
        TextBox txPassword = (TextBox)FindControl(ControlToCompare);
        if (txPassword.Text.Length == 0)
        {
            //No password entered so don't compare
            return true;
        }
        else
        {
            if (txCompare.Text == txPassword.Text)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        if (EnableClientScript) { this.ClientScript(); }

    }

    //Add the custom attribute here
    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        base.AddAttributesToRender(writer);
        if (this.RenderUplevel)
        {
            Page.ClientScript.RegisterExpandoAttribute(this.ClientID, "controltocompare", base.GetControlRenderID(ControlToCompare));
        }
    }

    //Generate and register the script for client side validation
    private void ClientScript()
    {
        StringBuilder sb_Script = new StringBuilder();
        sb_Script.Append("<script language=\"javascript\">");
        sb_Script.Append("\r");
        sb_Script.Append("function pw_verify(sender) {");
        sb_Script.Append("\r");
        sb_Script.Append("var txCompare = document.getElementById(document.getElementById(sender.id).controltovalidate);");
        sb_Script.Append("\r");
        sb_Script.Append("var txPassword = document.getElementById(document.getElementById(sender.id).controltocompare);");
        sb_Script.Append("\r");
        sb_Script.Append("if (txPassword.value == '')");
        sb_Script.Append("\r");
        sb_Script.Append("{");
        sb_Script.Append("\r");
        sb_Script.Append("return true;");
        sb_Script.Append("\r");
        sb_Script.Append("}");
        sb_Script.Append("\r");
        sb_Script.Append("else");
        sb_Script.Append("\r");
        sb_Script.Append("{");
        sb_Script.Append("\r");
        sb_Script.Append("if (txCompare.value == txPassword.value)");
        sb_Script.Append("\r");
        sb_Script.Append("{");
        sb_Script.Append("\r");
        sb_Script.Append("return true;");
        sb_Script.Append("\r");
        sb_Script.Append("}");
        sb_Script.Append("\r");
        sb_Script.Append("else");
        sb_Script.Append("\r");
        sb_Script.Append("{");
        sb_Script.Append("\r");
        sb_Script.Append("return false;");
        sb_Script.Append("\r");
        sb_Script.Append("}");
        sb_Script.Append("\r");
        sb_Script.Append("}");
        sb_Script.Append("\r");
        sb_Script.Append("}");
        sb_Script.Append("\r");
        sb_Script.Append("</script>");
        Page.ClientScript.RegisterClientScriptBlock(GetType(), SCRIPTBLOCK, sb_Script.ToString());
        Page.ClientScript.RegisterExpandoAttribute(ClientID, "evaluationfunction", "pw_verify");
    }
}
于 2012-02-16T11:48:43.270 に答える
0

私はこれをやろうとしました:(patmortechによる、どうもありがとう!)

FWIW、[パスワード] ボックスを ControlToValidate に、[パスワードの確認] ボックスを [ControlToCompare] にすると、パスワード ボックスに何かが含まれ、検証が実行されるため、機能します。

もちろん、これにより、空のパスワード ボックスと入力済みの確認ボックスを含むフォームを送信できるため、必要なバリデータを両方に配置することをお勧めします。

空のパスワードと入力済みの確認ボックスを残すことを避けるために、別の比較バリデーターをパスワード ボックスに置き、ControlToValidate と ControlToCompare の値を入れ替えました。

于 2013-05-16T15:06:59.463 に答える
0

CompareValidator、RegularExpressionValidator、および RangeValidator 検証コントロールは、空でない文字列値で動作しています。これは、入力時に何らかの条件を満たす必要がある非必須フィールドがある場合に役立ちます。

たとえば、2 つのフィールドを持つフォームがあるとします。必須ではありませんが、入力時に検証する必要がある代替メール。これを検証するには、RequiredFieldValidator と RegularExpressionValidator をプライマリ メールに追加し、RegularExpressionValidator のみを 2 番目のフィールドに追加します。

RegularExpressionValidator が空の入力でトリガーされた場合、上記のフォームを検証するのは難しいでしょう。2 番目の正規表現を変更して空の値を許可する必要があります。

于 2008-11-06T08:15:31.440 に答える