自定义验证控件在控件中未触发

3
所以问题在这里。我在一个.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个回答

3
将DropDownList的CausesValidation属性设置为true,默认值为false
<asp:DropDownList ID="ddlQuestions" CausesValidation="True" CssClass="if" DataTextField="Question" DataValueField="iD" runat="server">

同时,您还需要相应地设置其Validationgroup属性(请参见下面的属性)。

顺便提一句:您不需要在用户控件中使用成员变量ValidationGroup。只需使用一个公共属性ValidationGroup直接设置/获取验证器的ValidationGroup属性即可。这样做的好处是,由于它存储在ViewState中,您无需在每次postback时都设置它,并且如果需要,您也可以在用户控件本身中设置它。

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

很遗憾,这没有产生任何区别 :( 不过感谢您对属性的建议,听起来是一个好建议。 - Icestorm0141

0
原来答案是非常愚蠢的。当我实例化包含所有这些代码的控件时,我必须在前端而不是后端设置ValidationGroup属性。
假设我发布的代码在名为QuestionControl.ascx的.ascx文件中。在在我的页面上注册控件之后,我必须编写以下内容:
<asp:QuestionControl runat="server" id="qcPage" ValidationGroup="editQuestion" />

不知道为什么会说:

qcPage.ValidationGroup = "editQuestion";

因为该属性仅为字符串,所以无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接