Une approche plus évolutive serait d'utiliser la syntaxe suivante (remplacer le ResultsSpan par un panneau ASPX aussi) ...
function LookUpStock()
{
var lb = document.getElementById('<%=ListBox1.ClientID%>');
var product = lb.options[lb.selectedIndex].text;
CallServer(product, "");
}
function ReceiveServerData(rValue)
{
document.getElementById('<%=ResultsSpan.ClientID%>').innerHTML = rValue;
}
De cette façon, si le nom (ou la page réelle) de la page MasterPage change le code fonctionnera toujours.
Fondamentalement, le processus ASP.NET analyse la page et remplace les directives <% =%> par le nom correct du contrôle sur le client.
Cette approche fonctionnera également si vous avez des contrôles imbriqués. Dans votre exemple, si un contrôle était imbriqué dans un autre panneau, l'ID affiché ressemblerait à quelque chose comme MASTERPAGEPREFIX_CONTAINERCONTOLNAME_ListBox1 et votre travail échouerait.
En tant que principe général son considéré normalement une mauvaise idée de « coder en dur » ids côté client dans votre balisage - laisser le processus ASP.NET gérer pour vous
Cette technique n'est pas une bonne idée. À long terme, votre code finira par se briser. Vous devriez utiliser la solution et les conseils offerts par @Rich Andrews. – rtpHarry