2009-05-08 11 views
10

Y a-t-il un moyen pour que je puisse utiliser C# pour charger, puis "rendre" un contrôle ascx? Essentiellement, j'essaie de remplacer ASP en ligne par une fonction C# qui retournera le même code HTML. Cela me permettrait alors de le définir en tant que webmethod afin que je puisse mettre à jour cette section de la page avec jQuery, en utilisant le même code qui a généré le html original.Charger le composant ascx en utilisant le code C#

J'ai vraiment besoin d'un moyen de faire cela, et cela semble être une voie logique.

Répondre

17

Vous devez créer une page dans laquelle vous restituez le contrôle:

public static string RenderUserControl(string path) 
{ 
    Page pageHolder = new Page(); 
    Control viewControl = pageHolder.LoadControl(path); 

    pageHolder.Controls.Add(viewControl); 
    using(StringWriter output = new StringWriter()) 
    { 
     HttpContext.Current.Server.Execute(pageHolder, output, false); 
     return output.ToString(); 
    } 
} 

Un contrôle utilisateur lui-même ne sera pas rendu. (This article a des informations connexes à partir de laquelle j'ai emprunté du code).

1

Je n'ai pas essayé, mais vous pouvez charger une commande en utilisant la fonction LoadControl:

Control Example = LoadControl("~\\Controls\\MyControl.ascx"); 

Ensuite, vous pouvez essayer de rendre le contrôle:

StringWriter sw = new StringWriter(); 
HtmlTextWriter htw = new HtmlTextWriter(sw); 
Example.RenderControl(htw); 
Response.Write(sw.ToString()); 
Response.End(); 

Mais assurez-vous que vous override VerifyRenderingInServerForm et basculez EnableEventValidation sur false sur la page. Oubliez ce que j'ai écrit ci-dessus. Je suis retourné et testé et vous ne pouvez pas appeler LoadControl parce que la méthode web est statique. Comme il est statique, vous n'avez pas d'objet Page à appeler ... Ce qui signifie qu'il n'y a pas de chargement dynamique des contrôles utilisateur.

+1

Vous êtes en fait la plupart du temps à droite. MyUsercontrol uc = (MyUserControl) Page.LoadControl ("/ chemin/vers/MyUserControl.ascx"); Ensuite, vous pouvez soit faire SomeItem.Controls.Add (uc); ou rendre le contrôle à une chaîne comme vous l'avez démontré puis ajouter l'élément dom par programmation en utilisant jQuery, soit fonctionne. – Serapth

+0

En fait, je ne pense pas que l'ajout du contrôle serait une option dans ce cas. Pas de publication complète (aucun objet de page ou aucun objet auquel ajouter le contrôle), appelant depuis jQuery, etc. Mais l'approche de Keltex fonctionne. – JaCraig

1

Ce Explanation devrait avoir les réponses que vous recherchez. Fondamentalement, vous devez déclarer le contrôle dans la page, puis LoadControl dans le codebehind.

1

La réponse de Keltex a été la seule qui a fonctionné pour moi depuis que je travaillais avec des contrôles utilisateur imbriqués. De plus, si vous voulez passer des paramètres à votre contrôle utilisateur, vous pouvez le faire par:

_MyNameSpace_MyUserControl viewcontrol = (_MyNameSpace_MyUserControl) pageHolder.LoadControl(path); 

viewcontrol.MyParam = "My value"; 
0

son très simple à utiliser:

yourItem.Controls.Add(LoadControl("~/user control File path"));