繁体   English   中英

ASP.NET:CompareValidator和ValidationSummary

[英]ASP.NET: CompareValidator and ValidationSummary

我有一个CompareValidator和ValidationSummary奇怪的行为。

例如,下面的.aspx文件(后面没有相关的C#代码,因此只需将下面的代码放在新的.aspx文件中,即可运行并观察其行为)。

这些(改进的)步骤:

  1. 按F5启动应用程序;
  2. 点击按钮;
  3. 在左文本框中单击鼠标左键;
  4. 输入foo;
  5. 鼠标左键单击右文本框;
  6. 类型栏;
  7. 单击按钮(现在摘要不正确);
  8. 再次单击该按钮(现在摘要正确,但是由于尚未满足所有验证要求,因此您没有回信)。

这些步骤的结果略有不同,因为焦点更改是通过键盘进行的:

  1. 按F5启动应用程序;
  2. 点击按钮;
  3. 左键单击左文本框将其聚焦;
  4. 输入foo;
  5. 按Tab键将焦点移到右侧的文本框;然后按Tab键。
  6. 类型栏;
  7. 按Tab键将焦点移至该按钮(现在摘要不正确);
  8. 单击按钮(现在摘要正确,但是您还没有收到回信,因为尚未满足所有验证要求)。

为什么您需要对“提交”按钮执行两个操作(一个操作使其聚焦,一个操作单击它)以更新ValidationSummarry?

(比较的旧步骤:1.在两个文本框中均不输入任何内容,然后按SubmitButton 2.现在,您将在验证摘要中获得一个项目符号列表,并在SubmitButton前面获得两行验证行。3.现在,在TextBox1中输入“ foo”,然后在TextBox2中单击“栏”,然后按SubmitButton4。现在将两个项目保留在项目符号列表中,并且“两个文本框值应相同。”在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中的“提交”按钮。 这会使您在ValidationSummary中留下“不正确”的文本,因为仅在提交时才会更新-Java不会实时更新。

您确定要在步骤3的最后按“提交”按钮(即发生回发)吗?

这里有两个问题:

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

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

    2. 当表单实际尝试提交自己时完成。

在这种特殊形式中,asp:Button位于行尾(感谢Jason Berkan注意到了这一点;我希望我能为此给他声誉点!)。

现在,当您开始按下该按钮时,文本框将失去焦点,从而:

  1. 显示附带的验证器的Text属性
  2. 向右移动按钮
  3. 该按钮不会“被按下”,而只是获得焦点

由于现在未正确单击按钮(按下开始,但从未结束!),因此无法提交表单,因此未填写ValidationSummary。

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

例如,您可以通过以下方式对此:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM