2010-11-25 10 views
0

Voici mon JavaScript:Quel est le problème avec mon JavaScript? (C#/ASP.NET)

<script type="text/javascript"> 
function onholdev(index) { 
    var chk = document.getElementById('<%=grdCons.Rows[' + index + '].FindControl("chkHold").ClientID %>'); 
    var txt = document.getElementById('<%=grdCons.Rows[' + index + '].FindControl("txtReason").ClientID %>'); 


    if (chk.checked == true) { 
     txt.disabled = false; 
    } 
    else { 
     txt.disabled = true; 
     txt.value = ""; 
    } 
} 
</script> 

La variable 'index' provient de l'événement RowDataBound de mon GridView, comme ceci:

CheckBox chkHold = ((CheckBox)e.Row.FindControl("chkHold")); 
    chkHold.Attributes.Add("onchange", "onholdev(" + e.Row.RowIndex + ")"); 

Cependant, je suis obtenir 'trop de caractères en chaîne littérale' dans la première ligne de ma fonction (en commençant par var chk). Pourquoi est-ce?

Répondre

3

Vous mélangez un script côté client et côté serveur ... vous ne pouvez pas le faire. C'est exécuté côté serveur:

grdCons.Rows[' + index + '].FindControl("chkHold").ClientID 

Mais vous l'appelez côté client et essayer de passer une carte d'identité, qui est tout simplement pas quelque chose que vous pouvez faire, regarder votre fonction JavaScript rendu et ce sera beaucoup plus claire . Au lieu de cela il suffit d'utiliser l'ID de la table, vous pouvez trouver vos commandes de cette façon, par exemple:

var row = document.getElementById("grdCons").rows[index]; 
var inputs = row.getElementsByTagName("input"); 
//then filter by ID match, class, whatever's easiest and set what you need here 
+0

Ce n'est pas tout à fait vrai - Il utilise côté serveur pour la sortie du client Id d'un contrôle qui est à peu près la seule façon pour obtenir l'Id comme ASP.Net les génère semi-aléatoirement. Le javascript généré devrait ressembler à ceci: 'var chk = document.getElementById ('chk_0000001');'. Cela dit, je suis d'accord qu'il est préférable d'essayer et de rester tout le côté serveur si vous pouvez – Basic

+0

@Basiclife - Ce n'est pas correct, regardez la fonction, 'index' est un paramètre qui est passé, cela aurait JavaScript en essayant d'accéder à un serveur -side collection ('grdCons.Rows') par index, vous ne pouvez simplement pas faire cela. –

+0

Ah - Je n'avais pas remarqué qu'il utilisait un index JS dans l'appel. Ouais ça ne va jamais marcher :) – Basic

0

Le problème est votre utilisation des guillemets simples dans ' + index + '. Changez ceux-ci pour doubler qoutes et cela devrait fonctionner.

+0

Ce n'est pas le problème, je veux dire syntaxiquement oui, mais si vous reculez et regardez ce qu'il fait, cela ne va pas vraiment le résoudre :) –

+0

Non, il ne devrait pas. * index * est une variable dans la fonction javascript. Cela ne marchera jamais, et 'Rows []' attend un entier, pas la chaîne '" + index + "'. –

+0

@David - Même pas, c'est une fonction ** côté client **, JavaScript, vous ne pouvez pas accéder à une collection côté serveur comme celui-ci en premier lieu. –

1

Cela est probablement dû au fait que ASP.NET génère une erreur, qui est écrite dans l'appel côté client getElementById. La fonction onholdev est exécutée côté client et ne peut donc pas transmettre le paramètre d'index à ASP.NET qui est exécuté côté serveur. Essayez ceci:

<script type="text/javascript"> 
function onholdev(checkbox, textbox) { 
    var chk = document.getElementById(checkbox); 
    var txt = document.getElementById(textbox); 

    if (chk.checked == true) { 
     txt.disabled = false; 
    } 
    else { 
     txt.disabled = true; 
     txt.value = ""; 
    } 
} 
</script> 

Le remplacement de votre serveur - code côté avec ceci:

CheckBox chkHold = ((CheckBox)e.Row.FindControl("chkHold")); 
chkHold.Attributes.Add("onchange", "onholdev('" + 
    e.Row.FindControl("chkHold").ClientID + "','" + 
    e.Row.FindControl("txtReason").ClientID + "')"); 
+0

+1 - certainement une autre solution viable ... Je * personnellement * vais la voie discrète, mais dans les formulaires Web la page est jonchée de script en ligne de toute façon ... –

+0

Je sais (soupir), et j'ai quelques problèmes avec cela actuellement. Il suce beaucoup de temps en mélangeant les deux ... :) –

Questions connexes