【问题标题】:ASP.NET Repeater control validation causing errorsASP.NET Repeater 控件验证导致错误
【发布时间】:2020-03-08 18:47:26
【问题描述】:

我正在开发一个基于 ASP.NET 表单的应用程序。

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

单选按钮列表

文本框

下拉列表

复选框列表

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

RequiredFieldValidator

自定义验证器

我在中继器外有一个按钮。当我点击保存按钮时,代码将循环遍历每个中继器项目,读取选定的数据并将其保存在数据库中。

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

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,那么我无法从转发器中的控件中读取值

【问题讨论】:

  • 哪个字段是必填项?
  • 在每个转发器行上,将有一个控件绑定到 requiredfieldvalidator。自定义验证器仅适用于复选框列表。错误说 requiredfieldvalidator 不能为空。
  • 如果您可以将代码简化到重现问题所需的绝对最低限度,您可能会获得更多帮助,其他人可以轻松复制和粘贴。将您的代码复制到独立的 .aspx 页面并删除以下内容:CMSUpdatePanel、所有标签和 div、除了两种类型的输入字段和 CustomValidator。在代码隐藏中,将Repeater 绑定到硬编码数据源,然后显示类中的所有代码。而且由于在您单击 Save 时会立即发生异常,因此您可能不需要包含 SaveAnswer。
  • 一个RequiredFieldValidator 需要一个ControlToValidate 属性,正如错误所说.... &lt;asp:RequiredFieldValidator ID="reqValidator" ControlToValidate="txtAnswer"

标签: asp.net webforms asprepeater


【解决方案1】:

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

  1. 由于我的转发器是动态构建的,所以我每次都绑定转发器,而不是使用 Page.IsPostBack

  2. 我没有在 Page_Load 中绑定中继器,而是在 Page_Init 中绑定

这解决了我的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多