2017-02-06 9 views
0

У меня есть родительский ретранслятор, который содержит еще один дочерний ретранслятор. Для простоты предположим, что дочерний ретранслятор содержит текстовое поле и Requiredvalidator.В ASP.NET Web Forms Я хочу получить контроль внутри дочернего репитера с javascript

Простой пример разметки:

<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 и enbale его:

создать этот метод, который стреляет в 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 (..) может помочь, но как мы можем использовать его в этом случае?

+0

Там будет много, много 'управления rfv21' - каждый родитель повторитель строка будет иметь столько же, как число его дочерние репетиры. Каждый из них будет иметь сгенерированный идентификатор. Вы хотите получить доступ к определенному, или к каждому из них одновременно? – Andrei

+0

Я хочу получить доступ к определенному rfv21, когда txt21 onchange срабатывает. Я хочу получить доступ к его rfv21, чтобы включить его. – Marzouk

+0

Тогда вам нужно получить к нему доступ относительно txt, который его запустил. Вы используете jquery? Будет довольно простая задача с ним – Andrei

ответ

1

Проблема заключается в том, что будет много таких элементов управления, по одному на каждую строку каждого дочернего ретранслятора. Все будут иметь несколько разные сгенерированные идентификаторы. Поэтому вместо того, запрашивая их идентификатору (невозможно), вы можете использовать JQuery, чтобы быстро найти их по отношению к TXT, что обожженного событие:

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>

2

Вы можете связать вызов функции javascript с событием Repeater Repeater.ItemDataBound.

Код 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 
} 
+0

Это также хороший и приемлемый ответ, но я выбираю другой, потому что он будет более чистым и легким в этом. сторона клиента – Marzouk