ASP.NET:CompareValidator和ValidationSummary

时间:2009-09-11 13:32:30

标签: asp.net

我在使用CompareValidator和ValidationSummary时遇到了一些奇怪的行为。

例如下面的.aspx文件(没有相关的C#代码隐藏,所以只需通过新的.aspx文件中的以下代码,运行并观察行为)。

这些(精炼的)步骤:

  1. 按F5启动应用程序;
  2. 点击按钮;
  3. 在左侧文本框中单击鼠标左键;
  4. 输入foo;
  5. 在右侧文本框中单击鼠标左键;
  6. 键入栏;
  7. 点击按钮(现在摘要不正确);
  8. 再次单击该按钮(现在摘要是正确的,但由于尚未满足所有验证要求,因此您不会收到回复信息。)
  9. 这些步骤的结果略有不同,因为焦点更改是通过键盘进行的:

    1. 按F5启动应用程序;
    2. 点击按钮;
    3. 在左侧文本框中单击鼠标左键以对其进行聚焦;
    4. 输入foo;
    5. 按Tab键移动焦点到右侧文本框;
    6. 键入栏;
    7. 按Tab键移动焦点到按钮(现在摘要不对);
    8. 点击按钮(现在摘要是正确的,但由于尚未满足所有验证要求,因此您不会收到回复信息。)
    9. 为什么您需要对“提交”按钮执行两个操作(一个操作以使其集中,一个点击它)以更新ValidationSummarry?

      (比较的旧步骤:  1.在两个文本框中都不输入任何内容,然后按SubmitButton  2.现在,您将在验证摘要中获得项目符号列表,并在SubmitButton前面显示两个验证行  3.现在在TextBox1中输入“foo”,在TextBox2中输入“bar”,然后按SubmitButton  4.现在,您将两个项目保留在项目符号列表中,并且“两个文本框值应该相同”。在SubmitButton前面  5.现在再次按SubmitButton  6.现在ValidationSummary正确包含“两个文本框值不相等”。 广告4:为什么ValidationSummary只包含一个项目符号“两个文本框值应该相同。”? )

          <asp:ValidationSummary ID="ValidationSummary" runat="Server" ShowSummary="true" DisplayMode="BulletList" />
          <asp:Label ID="lbl" AssociatedControlID="TextBox1" runat="Server" Text="Write into TextBox" />
          <asp:TextBox ID="TextBox1" runat="Server" />
          <asp:TextBox ID="TextBox2" runat="Server" />
          <asp:RequiredFieldValidator ID="req1" runat="Server" ControlToValidate="TextBox1"
              ErrorMessage="1st TextBox is Mandatory field" Text="<br>Please write something in 1st  Box." />
          <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="Server" ControlToValidate="TextBox2"
              ErrorMessage="2nd TextBox is Mandatory field" Text="<br>Please write something in 2nd Box." />
          <asp:CompareValidator ID="CompareValidator1" runat="Server" ControlToValidate="TextBox2"
              ControlToCompare="TextBox1" Operator="Equal" Type="string" Text="Both textbox values should be same."
              ErrorMessage="Both textbox values are not equal." Display="Dynamic" />
          <asp:Button ID="SubmitButton" runat="Server" Text="Submit" />
      

      注意:添加ValidationGroup没有帮助:

              <asp:ValidationSummary ID="ValidationSummary" runat="Server" ValidationGroup="All" ShowSummary="true" DisplayMode="BulletList" />
              <asp:Label ID="lbl" AssociatedControlID="TextBox1" runat="Server" Text="Write into TextBox" />
              <asp:TextBox ID="TextBox1" runat="Server" />
              <asp:TextBox ID="TextBox2" runat="Server" />
              <asp:RequiredFieldValidator ID="req1" runat="Server" ValidationGroup="All" ControlToValidate="TextBox1"
                  ErrorMessage="1st TextBox is Mandatory field" Text="<br>Please write something in 1st  Box." />
              <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="Server" ValidationGroup="All" ControlToValidate="TextBox2"
                  ErrorMessage="2nd TextBox is Mandatory field" Text="<br>Please write something in 2nd Box." />
              <asp:CompareValidator ID="CompareValidator1" runat="Server" ValidationGroup="All" ControlToValidate="TextBox2"
                  ControlToCompare="TextBox1" Operator="Equal" Type="string" Text="Both textbox values should be same."
                  ErrorMessage="Both textbox values are not equal." Display="Dynamic" />
              <asp:Button ID="SubmitButton" runat="Server" Text="Submit" ValidationGroup="All" />
      

      任何?

3 个答案:

答案 0 :(得分:0)

我能够重新创建的唯一方法是不按步骤3中的“提交”按钮。这会在ValidationSummary中留下“不正确”的文本,因为它仅在提交时更新 - 它不会通过Javascript实时更新。

您确定在第3步结束时按下了提交按钮(即发回帖)?

答案 1 :(得分:0)

这里有两个问题:

  1. 显示每个无效Validator控件的Text属性
  2. 使用无效验证器的ErrorMessage属性列表填充ValidationSummary

    1. 正在验证的字段失去焦点时正在完成。

    2. 当表单实际尝试提交时,表示正在完成。

  3. 在这种特殊的形式中,asp:Button位于该行的末尾(感谢Jason Berkan注意到这一点;我希望我可以为他提供声望点!)。

    现在,当您开始按下该按钮时,TextBox会失去焦点,因此:

    1. 显示随附的Validator的Text属性
    2. 将按钮移至右侧
    3. 按钮没有被“按下”,而只是获得焦点
    4. 由于按钮现在没有被正确点击(按下了按钮,但从未结束!),它无法提交表单,因此ValidationSummary未填充。

      解决方案很简单:确保表单提交控件在单击时永远不会移动。

      例如你可以通过:

      • 在他们面前放置<br />标记
      • 将它们放在单独的<tr>

答案 2 :(得分:-2)

尝试将ValidationGroup添加到所有验证控件。它应该解决这个问题。