2010-10-27 7 views
0

J'essaye d'utiliser le rappel OnClick pour appeler une fonction C#, cependant javascript jette une erreur en disant que la fonction est indéfinie (même si elle est dans le code C#).Le rappel OnClick pense qu'il s'agit d'une fonction javascript?

Cela ne se produit que si j'ajoute le contrôle via Controls.Add dans la page_load de la section C# call behind.

En d'autres termes, si je fais cela (dans la fonction Page_Load):

 LinkButton l = new LinkButton(); 
     l.Text = "Test"; 
     l.ID = "TestID"; 
     l.Attributes.Add("OnClick", "LinkButton_Click"); 
     l.Attributes.Add("runat", "server"); 
     l.Page = Page; 
     this.Controls.Add(l); 

LinkButton_Click n'est pas définie en fonction javascript, si je fais ceci:

Dans le ascx le fichier fonctionne bien etaappelle ctuellement la fonction C#.

+0

Un extrait de code est-il manquant? –

+1

hmm ... Je reçois une mauvaise odeur de code ici. Pourquoi n'utiliseriez-vous pas le gestionnaire d'événements LinkButton.Click, puisque vous le définissez en code-behind? –

Répondre

8

Les gestionnaires d'événements doivent être fixés sur le côté serveur:

LinkButton l = new LinkButton(); 
l.Text = "Test"; 
l.ID = "TestID"; 
l.Click += LinkButton_Click; 
l.Page = Page; 
this.Controls.Add(l); 

Lorsque vous utilisez la propriété Attributes vous êtes en train de joindre une fonction côté client qui n'existe pas.

1

Attribute.Add émet au code HTML, pas à l'aspx, donc vous lui dites qu'il devrait y avoir une fonction javascript appelée LinkButton_Click() pour gérer l'événement on click.

Pour joindre un événement pour objet aC#, ce qui suit est la syntaxe correcte:

LinkButton l = new LinkButton(); 
l.Text = "Test"; 
l.ID = "TestID"; 
l.Click += LinkButton_Click; // <-- this row attaches the event 
this.Controls.Add(l); 
2

Le problème est que lorsque vous définissez le LinkButton via le balisage, l'attribut OnClick est interprété dans le cadre du contrôle côté serveur. Lorsque vous ajoutez l'attribut OnClick par code-behind, vous définissez des attributs côté client (qui ne sont pas traités du tout par le serveur).

Si vous voulez vraiment définir ce gestionnaire d'événements via le code-behind, vous devez supprimer la ligne suivante:

l.Attributes.Add("OnClick", "LinkButton_Click"); 

et le remplacer par:

l.Click += LinkButton_Click; 
1

La façon dont vous êtes ajouter c'est ajouter l'attribut au html. Ce que vous devez faire est d'ajouter un gestionnaire d'événements l.Click + = new EventHandler ...

1

Vous devez ajouter le gestionnaire d'événements à l.Cliquez sur les attributs.