重复器中的必填字段验证器

6
我有一个重复器控件和其中的文本框。我想在文本框中添加必填字段验证器,该怎么做?
8个回答

8
<asp:Repeater id="myRep" OnItemDataBound="rep_ItemDataBound" runat="server">
    <ItemTemplate>
        <asp:TextBox id="tx" runat="server" />
        <asp:RequiredFieldValidator id="myVal" ControlToValidate="tx" ErrorMessage="Required" runat="server" />
    </ItemTemplate>
</asp:Repeater>

更新

将以下代码添加到后台代码中(还要稍微修改标记以订阅事件,请参见上文):

protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
     RequiredFieldValidator val = (RequiredFieldValidator)e.Item.FindControl("myVal");
     TextBox tb = (TextBox)e.Item.FindControl("tx");

     val.ControlToValidate = tb.ID;
}

不要问我为什么,但只有当我使用 tb.ID 而不是 tb.ClientID 时才有效。 - ngm
@ngm 我认为你是对的,因为我会假设验证器将尝试在当前 INamingContainer(在这种情况下为 Repeater)中查找控件。我已经更新了我的帖子。 - volpav
1
错误:无法找到由'myVal'的'ControlToValidate'属性引用的控件ID 'tx'。我该怎么解决? - user1509
我已经亲自测试过了,从我的观察来看,似乎唯一运行的验证是由“RequiredFieldValidator”注册的客户端验证脚本。我不认为服务器端验证实际上正在运行。我知道这是一个旧帖子,但您能否确认这是事实? - Zachary Kniebel
请注意,我已经通过重新绑定重复器和不重新绑定重复器进行了测试。 - Zachary Kniebel
显示剩余2条评论

5
如果您想通过单个按钮点击验证重复器中的所有文本框,那么可以这样简单实现:
  <asp:Repeater ID="rpt" runat="server">
     <ItemTemplate>
        <asp:TextBox ID="txt" runat="server">
        </asp:TextBox>
        <asp:RequiredFieldValidator ID="rqf" ControlToValidate="txt" 
        ErrorMessage="*" ValidationGroup = "TestValidationGroup" runat = "server">
        </asp:RequiredFieldValidator>
    </ItemTemplate>
   </asp:Repeater>
   <asp:Button ID = "btnSubmit" runat = "server" ValidationGroup = "TestValidationGroup" />

不需要检查任何数据绑定或任何事件。

2
您可以在重复项数据绑定上设置ControlToValidate值。

在onitemdatabound事件中获取textbox的clientid,然后将其设置为您的验证控件属性... - ogun

1

试一下这个

<asp:Repeater ID="rptSample" runat="server">
    <ItemTemplate>
        Name:<br />
        <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
        <asp:RequiredFieldValidator ID="rfvName" ControlToValidate="txtName" runat="server" Display="Static" ErrorMessage="Name field cannot be left blank"></asp:RequiredFieldValidator> 
    </ItemTemplate>
</asp:Repeater>
<br />
<asp:Button ID="btnSubmit" Text="Submit" runat="server" />

你能解释一下你是如何在你的端上实现这个解决方案的吗?在我的端上测试过了,运行良好。如果你点击提交按钮,它会在文本框控件旁边显示错误消息。你能把你的代码写在问题里吗? - Sukhjeevan

0
我在尝试这样做时,在RegisterExpandoAttribute中一直收到重复键异常。 当我在重复器内使用UserControl时,应该使用"OnDataBinding"而不是"ItemDataBinding" 这对我有用:
/// <summary>
/// Raises the <see cref="E:System.Web.UI.Control.DataBinding" /> event.
/// </summary>
/// <param name="e">An <see cref="T:System.EventArgs" /> object that contains the event data.</param>
protected override void OnDataBinding(EventArgs e)
{
    base.OnDataBinding(e);
    foreach (Control ct in this.Controls)
    {
        BaseValidator bv = ct as BaseValidator;
        if (null == bv)
        {
            continue;
        }
        bv.ControlToValidate = this.FindControl(bv.ControlToValidate).ID;
        bv.ValidationGroup = this.ValidationGroup;
    }
}

是的,我也认为这没有任何意义


0
protected void myRep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        ((RequiredFieldValidator)e.Item.FindControl("myVal")).ValidationGroup = ((TextBox)e.Item.FindControl("tx")).UniqueID;
    }
}

0
protected void Repeater_OnItemDataBound(object sender, RepeaterItemEventArgs e) {
    tblData tbldata = e.Item.DataItem as tblData;

    RequiredFieldValidator val = (RequiredFieldValidator)e.Item.FindControl("rfv");

    if (tbldata.FieldName.ToUpper().Contains("NOT NULL")) {
        TextBox tb = (TextBox)e.Item.FindControl("txtDATFieldName");
        val.ControlToValidate = tb.ID;
    }
    else {
        val.Enabled = false;   // disable when you dont need a validator
    }
}

0
也许你想对每一行进行验证... 将验证组设置为每一行一个组,像这样:
ValidationGroup='<%# "gropname" + Eval("Id") %>'

在验证器、文本框和按钮中执行此操作

希望对你有所帮助 G.


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