Usercontrol验证器已启用且有效,但调用了Page.Validate(“groupname”)和Page.IsValid == false

时间:2011-06-29 21:47:37

标签: asp.net validation

我有一个usercontrol,其中包含一些带有必填字段验证器的文本框和一些自定义验证器,并对它们进行比较验证器。在代码隐藏中,我检查了所有使用IsValid属性有效的验证器。此外,我在usercontrol中的内容位于更新面板中。

现在我做的时候

Page.Validate("myValidationGroup")

并查看Page.IsValid,即使我知道该论坛的验证员有效,也会说false

为什么会发生这种情况?

更新:

我只有一个usercontrol实例。我手动调试并在C#按钮上设置了断点,检查所有验证器是否有效。所有已启用的都是有效的,未启用的那些也是有效的。我不确定何时打电话Page.Validate("groupname"),如果Page.Validate,只会检查具有该组名称的控件(如果已启用)。但是在验证了残疾人有效后才有意义,因为如果禁用它们应该有效,我意识到这可能不是问题。

如果在我的单选按钮列表中选择了特定的单选按钮,则会启用某些验证器。我找到了解决这个问题的另一种方法,它不是那么漂亮,但确实有效。

以下是我的标记:

<!-- Note, I removed the divs and other ui stuff, and am just showing the core functionality bits -->
<asp:UpdatePanel ID="FeedbackUpdatePanel" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        1.&nbsp;<asp:Label ID="Question1Label" Text="* Which of the following best describes the primary purpose of today’s visit?" runat="server" /><br />
        <asp:RadioButtonList ID="Question1RadioButtonList" CellPadding="2" runat="server">
            <asp:ListItem Text="To learn about Transamerica Retirement Management" Value="A" />
            <asp:ListItem Text="To learn about the services offered by Transamerica Retirement Management" Value="B" />
            <asp:ListItem Text="To contact an advisor" Value="C" />
            <asp:ListItem Text="To access your accounts" Value="D" />
            <asp:ListItem Text="Other (Please explain):" Value="E" />
        </asp:RadioButtonList>
        <asp:RequiredFieldValidator ID="Question1RadioButtonListRequiredFieldValidator" ControlToValidate="Question1RadioButtonList" Enabled="true" EnableClientScript="true" Text="* Required" ValidationGroup="FeedbackValidationGroup" runat="server" />
        <br />
        <asp:TextBox ID="OtherQuestion1AnswerTextBox" Width="500" Height="100" TextMode="MultiLine" style="display:none;" runat="server" />
         <asp:RequiredFieldValidator ID="OtherQuestion1AnswerRequiredFieldValidator" ControlToValidate="OtherQuestion1AnswerTextBox" Enabled="false" EnableClientScript="true" Text="* Required" ValidationGroup="FeedbackValidationGroup" runat="server" />
        2.&nbsp;<asp:Label ID="Question2Label" Text="* Please describe your feedback, question or problem below:" runat="server" />
        <br />
        <asp:RequiredFieldValidator ID="Question2RequiredFieldValidator" ControlToValidate="Question2TextBox" EnableClientScript="true" Enabled="true" Text="* Required" ValidationGroup="FeedbackValidationGroup" runat="server" />
        3.&nbsp;<asp:Label ID="AskUserForEmailLabel" Text="Please enter your e-mail address if you would like to request a response to an inquiry:" runat="server" />
        <br />
        <asp:RequiredFieldValidator ID="AskUserForEmailRequiredFieldValidator" Display="Dynamic" ControlToValidate="AskUserForEmailTextBox" Enabled="false" Text="* Email address is required." ValidationGroup="FeedbackValidationGroup" runat="server" />
        <asp:CustomValidator ID="AskUserForEmailCustomValidator" Display="Dynamic" ControlToValidate="AskUserForEmailTextBox" ClientValidationFunction="validateEmail" ValidateEmptyText="false" Enabled="true" Text="* Please enter a valid e-mail address." ValidationGroup="FeedbackValidationGroup" runat="server" />
        <asp:Button ID="FeedbackSubmitButton" Text="Submit" OnClick="FeedbackSubmitButton_Click" ClientIDMode="Static" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

在我的代码隐藏点按钮中,我有

protected void FeedbackSubmitButton_Click(object sender, EventArgs e)
{
    if (Question1RadioButtonList.SelectedItem.Value == "C")
    {
        AskUserForEmailRequiredFieldValidator.Enabled = true;
    }

    if (Question1RadioButtonList.SelectedItem.Value == "E")
    {
        OtherQuestion1AnswerRequiredFieldValidator.Enabled = true;
    }

    // Does not seem to be working
    Page.Validate("FeedbackValidationGroup");

    if (Page.IsValid) 
    {
        // Perform my custom logic
    }
}

我想出的黑客是:

protected void FeedbackSubmitButton_Click(object sender, EventArgs e)
{
    if (Question1RadioButtonList.SelectedItem.Value == "C")
    {
        AskUserForEmailRequiredFieldValidator.Enabled = true;
    }

    if (Question1RadioButtonList.SelectedItem.Value == "E")
    {
        OtherQuestion1AnswerRequiredFieldValidator.Enabled = true;
    }

    List<BaseValidator> allValidators = new List<BaseValidator>();

    allValidators.Add(Question1RadioButtonListRequiredFieldValidator);
    allValidators.Add(OtherQuestion1AnswerRequiredFieldValidator);
    allValidators.Add(Question2RequiredFieldValidator);
    allValidators.Add(AskUserForEmailRequiredFieldValidator);
    allValidators.Add(AskUserForEmailCustomValidator);

    bool isValid = true;

    foreach (BaseValidator validator in allValidators)
    {
        if (!validator.IsValid)
        {
            isValid = false;
            break;
        }
    }

    if (isValid)
    {
        // Perform my custom logic
    }
}

现在这个黑客确实有效,但正如我之前所说,它并不漂亮。

有什么想法吗?

0 个答案:

没有答案