[c#]自定义验证工作不正常

标签: Asp.net C#
发布时间: 2017/2/25 3:23:56
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我写了如何防止用户将信息保存在数据库中,如果输入登录电子邮件地址 (用户名) 的自定义验证已经存在数据库中。

 <div class="span3">
                            <asp:TextBox ID="txtLoginEmailAddress" class="SearchTxtBox" runat="server" Text='<%# ds.Tables[0].Rows[0]["LoginEmailAddress"] %>'
                                MaxLength="50"> </asp:TextBox>
                         </div>
                         <div class="span6">
                            <asp:RequiredFieldValidator ID="valLoginEmailAddressRequired" runat="server" CssClass="Validator"
                                ValidationGroup="save" Display="Dynamic" ControlToValidate="txtLoginEmailAddress"
                                ErrorMessage="<b>User Name is required</b>"></asp:RequiredFieldValidator>
                             <asp:CustomValidator ID="CheckAvailablity" runat="server" ValidationGroup="save" ControlToValidate="txtLoginEmailAddress"
                              OnServerValidate="ValidateUserName"></asp:CustomValidator>

             <asp:Label ID="valDuplicatePassword" runat="server" style="color:red" Visible="False"></asp:Label></td>
                        </div>

       <asp:Button ID="btnSave" runat="server" Text="Save" CssClass="btn btn-small " OnClick="btnSave_Click"
                                ValidationGroup="save" />

在 cs 文件

       protected void ValidateUserName(object sender, ServerValidateEventArgs e)
    {
        SystemUserBL bl = new SystemUserBL(SessionContext.SystemUser);
        ds = new DataSet();
        bl.FetchForLoginEmailAddress(ds, txtLoginEmailAddress.Text);

        if (ds.Tables[0].Rows.Count > 0)
        {
            e.IsValid = false;
            valDuplicatePassword.Visible = true;
            valDuplicatePassword.Text = "<b>This User Name is already in use by another user.</b>";
            btnSave.Enabled = false;
            btnSaveclose.Enabled = false;
        }
        else
        {
            e.IsValid = true;
            btnSave.Enabled = true;
            btnSaveclose.Enabled = true;
            valDuplicatePassword.Visible = true;
            valDuplicatePassword.Text = "<b>Congratulations! " + txtLoginEmailAddress.Text + " is available.</b>";
        }
    }

       protected void btnSave_Click(object sender, EventArgs e)
    {
        try
        {
            if (save())
            { 
              SucessMessage();
            }
        }
        catch (Exception ee)
        {
            ErrorMessage(ee.Message);
        }
    }

现在当我们单击 save 按钮时它将在数据库中保存后显示验证消息。我想,它不应该被保存在数据库中,自定义验证应该像其他 ASP 工作。NET 的验证。请帮助!!!

解决方法 1:

你必须显式地检查在继续处理之前是有效页。所以你的情况︰

protected void btnSave_Click(object sender, EventArgs e)
{
    try
    {
      if (this.IsValid()) //this checks that the page passed validation, including custom validation
      {
        if (save())
        { 
          SucessMessage();
        }
      }
      else
      {
        //any custom error message (additional to the validators themselves) should go here
      }
    }
    catch (Exception ee)
    {
        ErrorMessage(ee.Message);
    }
}

严格这适用于所有的 ASP.NET 验证程序,但尤其是当你的情况,在你不使用客户端验证,你很可能会遇到此问题。即使你的验证器没有启用客户端,你无论如何应该做此项检查 — — 很容易为恶意用户可以绕过客户端验证和提交无效数据。

请参见本主题的更详细讨论这个博客︰ https://www.jardinesoftware.net/2012/03/31/net-validators-don 不-忘记-页面-isvalid /

赞助商