我使用OnServerValidation遇到了我的自定义验证程序的问题。我第一次提交时不会触发,但事后正确触发。
换句话说,即使我没有正确填写我的文本字段中的数据并第一次提交,验证器也没有发现错误,仍然接受该字段包含的数据,但是当我返回表单时,然后我第二次提交时就会发现不一致。
我有3个验证此字段的验证器。其他两个验证器工作正常,只有OnServer验证有问题。
我的示例ASP代码用于编辑:
<asp:TemplateField HeaderText="End Date" SortExpression="end_date">
<EditItemTemplate>
<asp:TextBox ID="txtEndDate" runat="server" Text='<%# Bind("End_Date", "{0:MM/dd/yyyy}") %>'></asp:TextBox>
<asp:Image ID="imgEndDt" runat="server" ImageUrl="images/calendar.png" ImageAlign="Middle" />
<asp:Label ID="hvEndDate" runat="server" Text="?" ToolTip="blah" BackColor="#507CD1" ForeColor="White" Font-Bold="True" Height="15" Font-Underline="True"></asp:Label>
<asp:RegularExpressionValidator ID="revEndDate" runat="server"ErrorMessage="RegularExpressionValidator" ControlToValidate="txtEndDate" Text="(mm/dd/yyyy), ex: 06/03/2011." ValidationExpression="([1-9]|0[1-9]|1[012])[- /.]([1-9]|0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d"></asp:RegularExpressionValidator>
<cc1:CalendarExtender ID="ceTestDt5" runat="server" TargetControlID="txtEndDate" PopupButtonID="imgEndDt"></cc1:CalendarExtender><br />
<asp:CustomValidator ID="cvEndDate" runat="server" ErrorMessage="blah" ControlToValidate="txtEndDate" ValidateEmptyText="True" ClientValidationFunction="currentDt"></asp:CustomValidator>
<br /><asp:CustomValidator ID="cvExitDateCred" runat="server" ErrorMessage="blah" OnServerValidate="exitDateCheck_server" ControlToValidate="txtEndDate"></asp:CustomValidator>
</EditItemTemplate>
我的CS代码背后的代码是:
protected void exitDateCheck_server(object obj, ServerValidateEventArgs args)
{
args.IsValid = true;
Boolean hasCredEndDate = false;
String personExit = String.Empty;
if (dvPerson.FindControl("txtEndDate") != null)
{
personExit = (dvPerson.FindControl("txtEndDate") as TextBox).Text.Trim();
if (personExit != String.Empty)
{
try
{
SqlDataReader rdr = null;
SqlConnection con = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand("blah", con);
cmd.Parameters.Add("blah", SqlDbType.VarChar).Value = txtPPersonId.Text;
con.Open();
rdr = cmd.ExecuteReader();
if (rdr.Read())
{
if (Int32.Parse(rdr["cnt"].ToString()) > 0)
{
hasCredEndDate = true;
}
}
cmd.Dispose();
con.Close();
if (hasCredEndDate == true)
{
args.IsValid = false;
SqlDataReader rdr2 = null;
SqlConnection con2 = new SqlConnection(constr);
SqlCommand cmd2 = new SqlCommand("blah, con2);
cmd2.Parameters.Add("blah", SqlDbType.VarChar).Value = txtPPersonId.Text;
cmd2.Parameters.Add("blah", SqlDbType.VarChar).Value = (dvPerson.FindControl("txtEndDate") as TextBox).Text;
con2.Open();
rdr2 = cmd2.ExecuteReader();
if (rdr2.Read())
{
if (Int32.Parse(rdr2["cnt"].ToString()) > 0)
{
args.IsValid = true;
}
}
cmd2.Dispose();
con2.Close();
}
}
catch (Exception e)
{
lblMessage.Text = e.ToString();
}
}
}
}
如果我遗漏任何必要的信息,我会道歉。如果需要,我会添加。