2009-09-01 24 views
8

Mam następujący kontrola serwera tekstowe na mojej stronie internetowej:Jak przekazać rzeczywisty identyfikator klienta kontrolki serwera do funkcji javascript?

<asp:TextBox ID="txtZip" runat="server" onchange="ZipCode_OnChange(this, <%= txtZip.ClientId %>, txtCity, txtState);/"> 

Gdy strona sprawia, że ​​jest zbudowany w tym następujące:

<input name="txtZip" type="text" id="txtZip" onchange="ZipCode_OnChange(this, &lt;%= txtZip.ClientId %>, txtCity, txtState);" /> 

próbuję przekazać klientowi polu tekstowym za Idas 2nd param do tej funkcji javascript:

function ZipCode_OnChange(txtZipCode, ClientId) { 
    var ret; 
    ret = WebService.GetCityAndState(txtZipCode.value, OnComplete1, OnError, ClientId); 
} 

Jak mogę dostać to, na serwerze, ocenić panowanie texbox i przekazać ten ciąg do dosłownego Funkcja JavaScript?

Odpowiedz

14

Umieść <%= txtZip.ClientId %> pomiędzy apostrofami, aby być tak:

'<%= txtZip.ClientId %>' 


<asp:TextBox ID="txtZip" runat="server" onchange="ZipCode_OnChange(this, '<%= txtZip.ClientId %>', txtCity, txtState);" /> 

Aktualizacja

Proszę sprawdzić ten artykuł: http://www.jagregory.com/writings/how-to-use-clientids-in-javascript-without-the-ugliness/

Również lubię this answer

+11

Próbowałem już wcześniej, ale to, co kończy się przekazaniem do funkcji, to literał "<% = txtZip.ClientId%>" ", tekst w treści stronicowania serwera nigdy nie był oceniany. – ChadD

7

Istnieje wiele sposobów, aby to naprawić, ale uważam, że najprostszy ing zrobić w ogólnym przypadku jest użyć ScriptManager zawierać osobny skrypt na szczycie moich stronach specjalnie w celu dodania ClientIDs:

void AddClientIDs() 
{ 
    var clientIDs = new StringBuilder(); 
    var declaration = "var {0}={1};"; 

    clientIDs.AppendFormat(declaration, "txtZip", txtZip.ClientID);   


    ClientScript.RegisterClientScriptBlock(this.GetType(), "ClientIDs", clientIDs.ToString(), true); 
} 

telefon, że w przypadku prerender (gdzieś po wiązania z danymi). Następnie, jeśli chcesz mieć trochę wyobraźni, możesz łatwo dostosować metodę do akceptacji tablicy IEnumerable lub params formantów i pozwolić jej używać nazw kontrolnych dla nazw zmiennych javascript. Czasem robię to, ale zwykle wystarczy tylko dodać to, czego potrzebuję bezpośrednio do metody.

Nawet to jest nieco niewygodne, ponieważ kontrole obejmujące inne pojemniki nazewnictwa (takie jak siatki) mogą nadal powodować problemy. Chciałbym zobaczyć zespół ASP.Net zbudować coś takiego bezpośrednio do ramy wkrótce, ale nie jestem naprawdę spodziewałem się :(

6
<asp:TextBox ID="txtZip" runat="server" onchange="ZipCode_OnChange(this, txtCity, txtState);"> 


function ZipCode_OnChange(element, txtCity, txtState) { 
    var ClientId = element.getAttribute('id'), 
     ret = null, 
     value = element.value; 

    ret = WebService.GetCityAndState(value, OnComplete1, OnError, ClientId); 
} 
0

I rozwiązać ten sam problem z <asp:CheckBox...

podczas korzystania <%= TargetControl.ClientID %> (bez apostrofów okolic), ASP.NET renderuje '&lt;%= TargetControl.ClientID %>' i związany z funkcją JavaScript isnt nazywa.

podczas korzystania '<%= TargetControl.ClientID %>' (z cytatami Sigle okolic), ASP.NET do not oblicza wyrażenie i tynków dokładnie to samo w pojedynczych cudzysłowach

Więc zdecyduję się spróbować z wejścia (pole wyboru) kontrolę HTLM zamiast, stosując następujący znaczników

<input id="CheckBox1" type="checkbox" onclick="myFunction(someValue, '<%= TargetControl.ClientID %>')" /> 

i to działało !!!

Mam nadzieję, że to pomaga.

1

Przyszedł przez ten sam problem, nie mógł naprawić za pomocą żadnej z metod podanych powyżej. Dodałem więc pośrednie JS dodało wywołanie do rzeczywistej funkcji JS w oparciu o przekazaną wartość.Wiem, że jest to jedna lawa metoda rozwiązania tego problemu, ale i tak zadziałało.

Przed:

<asp:ListBox ID="List1" runat="server" ondblclick="AddToList2(this,'<%= List2.ClientID %>');" SelectionMode="Multiple" /> 

Po

<asp:ListBox ID="List1" runat="server" ondblclick="ProcessList('Add');" SelectionMode="Multiple" /> 

<script> 
function ProcessList(xStr){ 
if(xStr == "Add") 
    AddToList2('<%= List1.ClientID %>', '<%= List2.ClientID %>'); 
else 
    DeleteFromList2('<%= List2.ClientID %>');} 
</script> 
1

można dodać zdarzenie onchange z kodem tyle w metodzie Page_Load.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) return; 
    txtZip.Attributes.Add("onclick", "ZipCode_OnChange(" + txtZip.ClientID + ")"); 
} 

Jeśli chcesz przekazać więcej niż jedną kontrolę wraz z ich identyfikatorem klienta, to podejście jest dobrym wyborem.

Mam nadzieję, że rozwiąże to problem.

Powiązane problemy