【发布时间】: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属性,正如错误所说....<asp:RequiredFieldValidator ID="reqValidator" ControlToValidate="txtAnswer"
标签: asp.net webforms asprepeater