CustomValidator未在控件中触发

时间:2011-09-26 21:11:48

标签: c# asp.net drop-down-menu customvalidator

所以这就是问题所在。我在.ascx控件中有一个DropDownList,上面有一个CustomValidator。此控件具有由PageLoad中的属性设置的ValidationGroup。触发验证的按钮位于使用此控件的另一个文件中。问题是服务器端验证永远不会被解雇。我在其中添加断点,它们永远不会被击中。任何人对发生的事情都有任何想法?这是代码:

Dropdown.ascx:

    <asp:DropDownList ID="ddlQuestions" runat="server">
    </asp:DropDownList>
    <asp:CustomValidator runat="server" ID="cvddlQuestions" OnServerValidate="cvddlQuestions_ServerValidate"
         ErrorMessage="* Parent question is required." ValidateEmptyText="true" Display="Dynamic" />
    </p>
</div>

代码背后:

protected void Page_Load(object sender, EventArgs e)
{
    cvddlQuestions.ValidationGroup = ValidationGroup; 
    //ValidationGroup is a property in the parent file that is being set on PageLoad
}

protected void cvddlQuestions_ServerValidate(object sender, ServerValidateEventArgs args)
{
    args.IsValid = false;// (ddlQuestions.SelectedValue != "-1");
}

在使用Dropdown.ascx的父文件中,我有这个按钮:

<asp:LinkButton ID="btnQuestionAdd" runat="server" OnClick="btnQuestionAdd_Click" 
    ValidationGroup="editQuestion" CommandName="add" />

父文件代码背后:

protected void btnQuestionAdd_Click(object sender, EventArgs e)
{
    Page.Validate("editQuestion");
    if (Page.IsValid)   //ALWAYS SEEMS TO BE TRUE
    {
        //Do something
    }
}

当我向customvalidator添加客户端验证功能时,它没有问题。但页面总是返回有效。我尝试添加一个ControlToValidate并设置ValidateEmptyText =“true”,我仍然得到相同的结果。我错过了什么?

2 个答案:

答案 0 :(得分:3)

将DropDownList的CausesValidation - 属性设置为true,默认为false

<asp:DropDownList ID="ddlQuestions" CausesValidation="True" CssClass="if" DataTextField="Question" DataValueField="iD" runat="server">

您还必须相应地设置它的Validationgroup属性(参见下面的属性)。

附注:您的UserControl中不需要成员变量ValidationGroup。只需使用直接设置/获取Validator的ValidationGroup属性的公共属性ValidationGroup。通过这种方式,您无需在每次回发时设置它,因为无论如何它都存储在ViewState中,如果需要,您也可以在UserControl中设置它。

public string ValidationGroup {
    get { return cvddlQuestions.ValidationGroup; }
    set { cvddlQuestions.ValidationGroup = value; ddlQuestions.ValidationGroup=value; }
}

答案 1 :(得分:0)

事实证明,答案是令人难以置信的愚蠢。当我实例化所有这些代码所在的控件时,我必须在前端而不是后端设置ValidationGroup属性。

假设我发布的代码位于名为QuestionControl.ascx的.ascx文件中。在我的页面上注册控件后,我必须写下以下内容:

<asp:QuestionControl runat="server" id="qcPage" ValidationGroup="editQuestion" />

不知道为什么说:

qcPage.ValidationGroup = "editQuestion";

没有用,因为该属性只是一个字符串。