我有家长中继器,其中包含另一个儿童中继器。为了简单起见,假设子中继器包含文本框和请求验证器。
标记的简单示例:
<asp:Repeater ID="rpt1" runat="server">
<HeaderTemplate>
....
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="lbl1" runat="server" CssClass=".."></asp:Label>
<div class="..">
<asp:Repeater ID="rpt2" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ItemTemplate>
<div class="...">
<asp:TextBox ID="txt21" runat="server" CssClass="..." MaxLength="7" CssClass="ErrorMessage" ErrorMessage="*" />
<asp:RequiredFieldValidator ID="rfv21" runat="server" CssClass="ErrorMessage" ErrorMessage="*" />
</div>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>
</div>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>我创建了这样一个方法来获取第二个中继器的RequiredField id:
function getId(){
var myId = document.getElementById('<%= rfv21.ClientID %>');
}但这当然不起作用,而且也有一个例外:
The name control-name Does Not Exist in the Current Context那我该怎么做呢?
我想提到的是,对于我来说,业务需要的是,当onchange、onkeyup、onkeydown事件为txt21触发时,它将得到它对应的rfv21并对其进行封装:
我创建了这个方法,它触发onchange、onkeyup、onkeydown事件更改:
function txt21_onChange(txtbox) {
var newValue = this.value;
var oldValue = this.oldvalue;
var myRfv2 = document.getElementById('<%= rfv2.ClientID %>');
if (newValue != oldValue) {
ValidatorEnable(myRfv2, true);
}
} 我将txt21更新为:
<asp:TextBox ID="txt21" runat="server" CssClass=".." MaxLength="7" onkeyup="javascript: txt21_onChange(this);this.oldvalue = this.value;" />但这条线想要工作:
var myRfv2 = document.getElementById('<%= rfv2.ClientID %>');正如我之前解释过的。
我认为Item.FindControl(.)也许会有帮助,但我们如何在这种情况下使用它呢?
发布于 2017-02-06 13:03:49
这里的问题是,将会有许多这样的控制,每个子中继器的每一行一个。所有这些都将有稍微不同的生成ID。因此,您可以使用jQuery相对于触发事件的txt快速找到它们,而不是按id (不可能)查询它们:
function txt21_onChange(txtbox) {
var rfv2 =
$(textbox) // gives you the jquery object representing the textbox
.closest("div") // the parent div
.find("id*='rfv2'"); // the element you are looking for, id contains rfv2这回答了这个线程中关于如何获得元素的直接问题。但我不确定它是否能解决您启用/禁用验证的更大问题。您不能通过javascript中的服务器端控件轻松地做到这一点。此外,在您的代码中,在默认情况下不会禁用验证器。虽然我认为所有这些都值得在SO>上单独问一个问题
发布于 2017-02-06 13:33:49
您可以从Repeater Repeater.ItemDataBound事件绑定javascript函数调用。
码Bahind
void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
TextBox txt21 = (TextBox)e.Item.FindControl("txt21");
RequiredFieldValidator rfv21 = (RequiredFieldValidator)e.Item.FindControl("rfv21");
txt21.Attributes.Add("onclick", "txt21_onChange('" + txt21.ClientID + "','" + rfv21.ClientID + "'" )
}
} Javascript
function txt21_onChange(txt21ID, rfv21ID)
{
txt21ID = document.getElementById(txt21ID);
rfv21ID = document.getElementById(rfv21ID);
//The above are TextBox and RequiredFieldValidator objects of row of TextBox that triggered change event.
//You can use these object
}https://stackoverflow.com/questions/42067476
复制相似问题