代码之家  ›  专栏  ›  技术社区  ›  Jeroen Wiert Pluimers

ASP.NET:比较计算器和验证摘要

  •  0
  • Jeroen Wiert Pluimers  · 技术社区  · 15 年前

    我用比较器和验证摘要发现了一些奇怪的行为。

    例如,下面的.aspx文件(没有相关的c codebehind,所以刚刚在新的.aspx文件中跳过下面的代码,运行并观察行为)。

    这些(精致的)步骤:

    1. 按F5启动应用程序;
    2. 点击按钮;
    3. 在左侧文本框中单击鼠标左键;
    4. FO型;
    5. 在右文本框中单击鼠标左键;
    6. 型棒;
    7. 单击按钮(现在摘要不正确);
    8. 再次单击该按钮(现在概要是正确的,但是您不会得到一个回发,因为还没有满足所有验证要求)。

    这些步骤的结果稍有不同,因为焦点是通过键盘改变的:

    1. 按F5启动应用程序;
    2. 点击按钮;
    3. 在左侧文本框中单击鼠标左键将其调焦;
    4. FO型;
    5. 按Tab键移到右文本框的焦点;
    6. 型棒;
    7. 按Tab键移动到按钮的焦点(现在摘要不正确);
    8. 单击按钮(现在摘要是正确的,但由于还没有满足所有验证要求,因此您不会得到回发)。

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

    (旧的比较步骤: 1。在两个文本框中都不输入任何内容,然后按Submit按钮 2。现在,您可以在验证摘要中得到一个项目符号列表,在提交按钮前面有两个验证行。 三。现在在文本框1中输入“foo”,在文本框2中输入“bar”,然后按Submit按钮 4。现在您将这两个项目保留在项目符号列表中,并且“两个文本框值应该相同。”在SubmitButton前面 5。现在再按一下提交按钮 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 回复  |  直到 15 年前
        1
  •  0
  •   Jason Berkan whiteproud    15 年前

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

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

        2
  •  0
  •   Community CDub    7 年前

    这里有两个问题:

    1. 显示每个无效验证程序控件的文本属性
    2. 用无效验证器的错误消息属性列表填充validationsummary

      1. 当正在验证的字段失去焦点时正在执行。

      2. 当窗体实际尝试提交自身时正在执行。

    在这个特定的表单中,asp:button位于行的末尾(感谢 Jason Berkan 注意到这一点,我真希望我能给他点名气!).

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

    1. 显示随附验证器的文本属性
    2. 向右移动按钮
    3. 按钮没有“按下”,只是获得焦点

    因为按钮现在没有被正确点击(按下开始,但从未结束!)无法提交表单,因此未填写验证摘要。

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

    例如,您可以通过:

    • 放置 <br /> 在他们前面贴标签
    • 把它们分开 <tr>
        3
  •  -2
  •   Nirlep    15 年前

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