2010-09-03 10 views
2

J'ai un contrôle d'interface utilisateur personnalisé qui a une classe JavaScript écrite autour de l'infrastructure AJAX.NET. Il hérite de Sys.UI.Control. Le contrôle lui-même est un UserControl. Dans la méthode de rendu, j'emballe le contrôle dans un span et donne l'ID de la travée le ClientID du contrôle de l'utilisateur. De cette façon, je peux le faire plus tard:Sys.Application.add_init Non appelé UpdatePanel Mise à jour

var control = $find('<%= ServerControlID.ClientID %>'); 

Cela me permet d'obtenir l'objet client qui représente le contrôle de l'interface utilisateur.

je crée le contrôle en Javascript en faisant cela (aussi dans la méthode render)

writer.Write(@"<script type='text/javascript'> 
Sys.Application.add_init(function() { 
debugger; 
    $create(General.Filters.AccountGroupFilter, 
     " + GetProperties() + @", 
     null, 
     null, 
     $get('" + this.ClientID + @"')); 
}); 
</script>"); 

Cela crée l'objet. C'est fait à l'intérieur de l'événement init du cycle de vie.

Le problème est que ce contrôle est enveloppé dans un UpdatePanel par une page consommatrice/contrôle. Lorsqu'un autre contrôle initie une mise à jour, toutes les interfaces utilisateur des contrôles sont redessinées, MAIS l'événement init ne se déclenche JAMAIS à nouveau.

Qu'advient-il alors est quand je fais ceci:

var control = $find('<%= ServerControlID.ClientID %>'); 
if(control != null) 
    control.doSomething(); 

Rien ne se passe parce que le $ find ne trouve pas le contrôle après l'appel AJAX. Je sais que je ne fais pas cela correctement. Où vais-je mal? L'article MSDN pour ce truc me pointe dans les cercles!

EDIT: Je Figured inclure la méthode Render que je fais dans la partie de UserControl.cs

protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write("<span id=\"" + this.ClientID + "\" >"); 
     writer.Write(@"<script type='text/javascript'> 
     Sys.Application.add_init(function() { 

     $create(TradePMR.OMS.Resources.UserControls.General.Filters.AccountGroupFilter, 
     " + GetProperties() + @", 
     null, 
     null, 
     $get('" + this.ClientID + @"')); 
     }); 
     </script>"); 

     base.Render(writer); 
     writer.WriteEndTag("span"); 
    } 

Répondre

0

Vous n'avez pas besoin d'écrire ce genre de choses Sys.Application.add_init vous; mettre en œuvre IScriptControl selon this MSDN article. La clé est la partie sur RegisterScriptControl et RegisterScriptDescriptors, qui enregistre votre contrôle avec le ScriptManager afin qu'une publication asynchrone recréera votre contrôle client si nécessaire.

En tant que note de bas de page, il existe un seperate but similar article here si vous implémentez Sys.UI.Behavior à la place.