ASP.. NET必填字段验证器和比较验证器不起作用

本文关键字:验证 比较 不起作用 字段 NET ASP | 更新日期: 2023-09-27 18:12:20

我的验证器都不工作。请帮助!提前感谢……

  if (rfvEmail.IsValid && rfvLoginName.IsValid && rfvNewPassword.IsValid
                && rfvConfirmPassword.IsValid && cvComparePasswords.IsValid)
            {
                DataSet ds = new DataSet();
                myDal.ClearParams();
                myDal.AddParam("@EmailAddress", txtEmail.Text);
                myDal.AddParam("@LoginName", txtLoginName.Text);
                myDal.AddParam("@NewLoginPassword", txtNewPassword.Text);
                ds = myDal.ExecuteProcedure("spResetPassword");
                lblPasswordMessage.Text = ds.Tables[0].Rows[0]["result"].ToString();                
            }

源代码如下所示:我还将按钮

上的CausesValidation设置为true
 <asp:RequiredFieldValidator
                    ID="rfvConfirmPassword"
                    runat="server"
                    ErrorMessage="Password Confirmation is required!"
                    ControlToValidate="txtConfirmPassword"
                    EnableClientScript="False"
                    ForeColor="Red"></asp:RequiredFieldValidator>                 
                <asp:CompareValidator 
                    ID="cvComparePasswords" 
                    runat="server" 
                    ControlToCompare="txtNewPassword"
                    ControlToValidate="txtConfirmPassword"
                    EnableClientScript="false"
                    ForeColor="Red"
                    ErrorMessage="Passwords entered by you do not match!">
                </asp:CompareValidator>

我正在尝试验证保存按钮中的控件:

 protected void btnSavePassword_Click(object sender, EventArgs e)
    {
        rfvEmail.Validate();
        rfvLoginName.Validate();
        rfvNewPassword.Validate();
        cvComparePasswords.Validate();
        resetPassword();
      }

ASP.. NET必填字段验证器和比较验证器不起作用

乍一看,您似乎正在以错误的方式进行验证。如果没有进一步的信息,很难诊断出确切的问题,因此我将提供一些一般性的建议。

您应该熟悉asp.net页面生命周期。在提供的链接中,请注意LoadValidation &回发事件处理 stage。Validation阶段自动发生,将验证页面上每个已验证的控件,并将Page.IsValid设置为truefalse。这意味着您不需要单独验证每个控件。

同样重要的是要注意,Validation出现在 Load之后,出现在回发事件处理之前。在PageLoad事件中,通过将默认值分配给控件,可能会弄乱验证。由于这个原因,!Page.IsPosback通常只用于设置初始页面加载的控件,而不用于随后的回发。在回发时,在你完成之前不要重置你的控件。在本例中,您的Click处理程序。

我是这样做的:

//Page Load event
protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostback)
    {
        //Set Control inital page load values etc in here
    }
}

private void resetPassword()
{
   //You should investigate try/catch blocks to handle database errors better
   DataSet ds = new DataSet();
   myDal.ClearParams();
   myDal.AddParam("@EmailAddress", txtEmail.Text);
   myDal.AddParam("@LoginName", txtLoginName.Text);
   myDal.AddParam("@NewLoginPassword", txtNewPassword.Text);
   ds = myDal.ExecuteProcedure("spResetPassword");
   lblPasswordMessage.Text = ds.Tables[0].Rows[0]["result"].ToString();          
}
protected void btnSavePassword_Click(object sender, EventArgs e)
{
    if(Page.IsValid) //The controls have already been validated now
    {
        resetPassword();
        //If you need to empty/reset fields on button click
        //do it here.
    }
        //Unless you want to reset them regarless of the validity
        //of the page. Then do it here.
}