ASP.NET Repeater控件验证导致错误

我正在研究基于ASP.NET表单的应用程序。

我有一个中继器绑定到数据库。每行具有以下任何控件:

RadioButtonList

文本框

DropDownList

CheckBoxList

每行有以下验证控件之一:

RequiredFieldValidator

CustomValidator

我在中继器外面有一个按钮。当我单击“保存”按钮时,代码将遍历每个转发器项,读取所选数据并将其保存在数据库中。

我面临的问题是,当我单击“保存”按钮时,它给了我错误:

The ControlToValidate property of 'reqValidator' cannot be blank.

我确保只在第一次加载转发器,而不是在页面回发时加载。 此外,似乎未执行“保存”按钮中的代码。这是我的代码:

<cms:CMSUpdatePanel runat="server" ID="updatePanelCampaignQuestions">
    <ContentTemplate>
         <asp:Repeater ID="repeaterQuestions" runat="server" OnItemdatabound="repeaterQuestions_Itemdatabound">
                <ItemTemplate>
                    <div class="repeater-container">
                        <asp:Label ID="lbQuestion" runat="server" Text='<%# Eval("Question") %>' />
                        <asp:Label ID="lbQuestionType" runat="server" Text='<%# Eval("QuestionType") %>' Style="display: inline; visibility: hidden" />
                        <asp:Label ID="lbAnswers" runat="server" Text='<%# Eval("Answers") %>' Style="display: inline; visibility: hidden" />
                        <asp:Label ID="lbArticleCampaignQuestionID" runat="server" Text='<%# Eval("ArticleCampaignQuestionID") %>' Style="display: inline; visibility: hidden" />

                        <div class="row validation-container">
                            <div class="col-md-12 col-lg-12">
                                <asp:TextBox ID="txtAnswer" CssClass="form-control" runat="server" TextMode="MultiLine" Rows="2" ValidationGroup="Campaign"></asp:TextBox>

                                <asp:RadioButtonList ID="rdAnswer" runat="server"></asp:RadioButtonList>

                                <asp:DropDownList ID="ddnAnswer" runat="server"></asp:DropDownList>

                                <asp:CheckBoxList ID="chkAnswer" CssClass="chkAnswer" runat="server"></asp:CheckBoxList>

                                <asp:RequiredFieldValidator ID="reqValidator" runat="server" Display="Dynamic" Style="color: #f00" />

                                <asp:CustomValidator ID="customValidator" runat="server" ClientValidationFunction="checkAnswer" Display="Dynamic" Style="color: #f00" />
                                <hr />
                            </div>
                        </div>
                    </div>
                </ItemTemplate>
            </asp:Repeater>

中继器OnItemdatabound的代码:

protected void repeaterQuestions_Itemdatabound(object sender,RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            string questionType = (e.Item.FindControl("lbQuestionType") as Label).Text;
            RequiredFieldValidator reqValidator = (RequiredFieldValidator)e.Item.FindControl("reqValidator");
            CustomValidator customValidator = (CustomValidator)e.Item.FindControl("customValidator");

            if (questionType.ToLower().Equals("text"))
            {
                e.Item.FindControl("txtAnswer").Visible = true;
                e.Item.FindControl("rdAnswer").Visible = false;
                e.Item.FindControl("chkAnswer").Visible = false;
                e.Item.FindControl("ddnAnswer").Visible = false;

                reqValidator.ControlToValidate = e.Item.FindControl("txtAnswer").ID;
                reqValidator.ErrorMessage = "Please fill the answer";

                e.Item.Controls.Remove(customValidator);
            }
            else if (questionType.ToLower().Equals("single selection"))
            {
                e.Item.FindControl("txtAnswer").Visible = false;
                e.Item.FindControl("rdAnswer").Visible = true;
                e.Item.FindControl("chkAnswer").Visible = false;
                e.Item.FindControl("ddnAnswer").Visible = false;

                string strAnswers = (e.Item.FindControl("lbAnswers") as Label).Text;
                string[] answers = strAnswers.Split(new[] { "@@" },StringSplitOptions.None);

                foreach(string answer in answers)
                {
                    (e.Item.FindControl("rdAnswer") as RadioButtonList).Items.Add(answer);
                }

                reqValidator.ControlToValidate = e.Item.FindControl("rdAnswer").ID;
                reqValidator.ErrorMessage = "Please select one";

                e.Item.Controls.Remove(customValidator);
            }
            else if (questionType.ToLower().Equals("drop down"))
            {
                e.Item.FindControl("txtAnswer").Visible = false;
                e.Item.FindControl("rdAnswer").Visible = false;
                e.Item.FindControl("chkAnswer").Visible = false;
                e.Item.FindControl("ddnAnswer").Visible = true;

                string strAnswers = (e.Item.FindControl("lbAnswers") as Label).Text;
                string[] answers = strAnswers.Split(new[] { "@@" },StringSplitOptions.None);

                (e.Item.FindControl("ddnAnswer") as DropDownList).Items.Add(new ListItem("- Please Select -","0"));

                foreach (string answer in answers)
                {
                    (e.Item.FindControl("ddnAnswer") as DropDownList).Items.Add(answer);
                }

                reqValidator.InitialValue = "0";
                reqValidator.ControlToValidate = e.Item.FindControl("ddnAnswer").ID;
                reqValidator.ErrorMessage = "Please select one";

                e.Item.Controls.Remove(customValidator);
            }            
            else if (questionType.ToLower().Equals("multiple selection"))
            {
                e.Item.FindControl("txtAnswer").Visible = false;
                e.Item.FindControl("rdAnswer").Visible = false;
                e.Item.FindControl("chkAnswer").Visible = true;
                e.Item.FindControl("ddnAnswer").Visible = false;

                string strAnswers = (e.Item.FindControl("lbAnswers") as Label).Text;
                string[] answers = strAnswers.Split(new[] { "@@" },StringSplitOptions.None);

                foreach (string answer in answers)
                {
                    (e.Item.FindControl("chkAnswer") as CheckBoxList).Items.Add(answer);
                }

                e.Item.Controls.Remove(reqValidator);
                customValidator.ErrorMessage = "Please select at least one";
            }
        }
    }

保存按钮的代码:

private void SaveAnswer()
    {
                int userID = GetUserID();
                int campaignID = getcampaignID();

                foreach (RepeaterItem item in repeaterQuestions.Items)
                {
                    string answer = "";
                    string questionType = (item.FindControl("lbQuestionType") as Label).Text;
                    int articleCampaignQuestionID = int.Parse((item.FindControl("lbArticleCampaignQuestionID") as Label).Text);

                    if (questionType.ToLower().Equals("text"))
                    {
                        answer = (item.FindControl("txtAnswer") as TextBox).Text;
                    }
                    else if (questionType.ToLower().Equals("single selection"))
                    {
                        answer = (item.FindControl("rdAnswer") as RadioButtonList).SelectedItem.Text;
                    }
                    else if (questionType.ToLower().Equals("drop down"))
                    {
                        answer = (item.FindControl("ddnAnswer") as DropDownList).SelectedItem.Text;
                    }
                    else if (questionType.ToLower().Equals("multiple selection"))
                    {
                        CheckBoxList answerList = (item.FindControl("chkAnswer") as CheckBoxList);

                        foreach (ListItem checkItem in answerList.Items)
                        {
                            if (checkItem.Selected)
                            {
                                answer += checkItem.Text + "@@";
                            }
                        }

                        if (answer.EndsWith("@@"))
                            answer = answer.Substring(0,answer.Length - 2);
                    }

         // save value of answer to database
    }

我对此坚持了很长时间。除上述页面外,页面上没有其他例外。

修改

页面回发的流程是什么?

点击btnSaveAnswer,执行按钮代码,重新加载转发器

点击btnSaveAnswer,转发器被重新加载,按钮代码执行

如果我将中继器绑定与:

if(!Page.IsPostBack)

我得到了必填字段验证器错误

如果我没有在 if 以上使用,则无法从中继器的控件中读取值

hushilan325 回答:ASP.NET Repeater控件验证导致错误

我在代码中发现了问题。这是我所做的:

  1. 由于我的中继器是动态构建的,因此每次都绑定中继器,而不使用Page.IsPostBack

  2. 我不是在Page_Load中绑定转发器,而是在Page_Init中进行绑定

这解决了我的问题

本文链接:https://www.f2er.com/3113298.html

大家都在问