【问题标题】:In ASP.NET Web Forms I want to get control inside child Repeater with javascript在 ASP.NET Web 窗体中,我想使用 javascript 控制子中继器
【发布时间】:2017-02-06 12:10:36
【问题描述】:

我有包含另一个子中继器的父中继器。 为简单起见,假设子转发器包含文本框和Requiredvalidator。

标记的简单示例:

<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

那我该怎么做呢?

我想提一下,我的业务需求是当 txt21 的 onchange、onkeyup、onkeydown 事件触发时,它将获得等效的 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(..) 可能会有所帮助,但在这种情况下我们如何使用它?

【问题讨论】:

  • 会有很多很多 rfv21 控件 - 每个父转发器行将有与其子转发器行一样多的数量。每个都会有一个生成的 id。你想访问一个特定的,还是同时访问所有的?
  • 我想在 txt21 onchange 触发时访问特定的 rfv21 我想访问它的 rfv21 以启用它
  • 那么你需要相对于触发它的 txt 来访问它。你用jquery吗?使用它将是相当容易的任务
  • 是的,我可以使用 JQuery 来完成这项任务
  • 请查看我对问题的更新

标签: javascript c# asp.net webforms asp.net-controls


【解决方案1】:

您可以绑定来自Repeater Repeater.ItemDataBound事件的javascript函数调用。

代码隐藏

 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  
}

【讨论】:

  • 这也是一个很好且可以接受的答案,但我选择了另一个,因为它会更干净,更容易做客户端
【解决方案2】:

这里的问题是会有很多这样的控件,每个子转发器的每一行都有一个。所有生成的 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>

上单独提出一个问题

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2021-04-12
    • 1970-01-01
    相关资源
    最近更新 更多