2010-02-16 2 views
4

Est-il possible de prendre un objet de page, ou peut-être un seul contrôle ASP.NET, et de le rendre dans une application de bureau d'une manière ou d'une autre? Par exemple, Visual Studio, étant une application de bureau rend les contrôles ASP.NET dans la surface de conception. Je veux faire quelque chose de similaire.Render les contrôles ASP.NET dans une application de bureau?

Éditer: Je réfléchis sur la façon de faire un concepteur très simple pour une application de saisie de données très simple. J'aurais des contrôles d'entrée de données ASP.NET personnalisés, et je voudrais que les utilisateurs profanes puissent voir à quoi la page pourrait ressembler le plus possible. Je voudrais donc qu'un panneau de l'application affiche la collection de contrôles rendue, mais le panneau n'a pas besoin d'être interactif en aucune façon. C'est à dire. pas de cliquer et de faire glisser ou de redimensionner des contrôles, etc. Il y aura des contrôles de formulaire Windows standard que l'auteur du formulaire interagit avec pour définir la mise en page de la page. Je vais simplement enregistrer une liste des contrôles qu'ils ont ajoutés avec d'autres informations fournies par le "concepteur" (qui sont des experts non techniques), et j'utiliserai ces informations pour créer ultérieurement la page ASPX réelle, soit par le biais d'un processus manuel ou automatisé, à déterminer.

+0

Visual Studio ne rend pas les contrôles ASP.Net comme vous le souhaitez. (Il n'exécute aucun code C# dans les contrôles) – SLaks

+0

@Slaks Oui, je sais que les contrôles peuvent fournir un rendu "truqué" juste pour le support de conception, mais je n'ai pas besoin que les contrôles se comportent comme ils le feraient sur une page web, J'ai juste besoin qu'ils ressemblent le plus possible à la façon dont ils apparaîtraient sur une page. – AaronLS

Répondre

7

Oui, c'est possible.

Vous devez créer un AppDomain distinct pour ASP.Net, comme décrit here.

EDIT: Pour afficher les pages, utilisez le code suivant:

string htmlSource; 
var page = (Page)BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page)); 

page.ProcessRequest(new HttpContext(new SimpleWorkerRequest("", null, null))); 
using (var writer = new StringWriter(CultureInfo.InvariantCulture)) { 
    using (var htmlWriter = new HtmlTextWriter(writer)) 
     page.RenderControl(htmlWriter); 
    htmlSource = writer.ToString(); 
} 

Notez que ce code doit être exécuté dans le ASP.Net AppDomain.
Pour ce faire, vous pouvez mettre une méthode publique du type que vous donnez à CreateApplicationHost.

+1

Mais cela crée un hôte EXE ordinaire, pas un hôte ASP. Il existe différents hôtes CLR et ils se comportent différemment. Alors que la différence entre les hôtes EXE et ASP n'est pas aussi grande qu'entre les hôtes EXE et SQL (ce sont les 3 hôtes CLR expédiés par MS), les différences sont exactement dans les spécificités ASP, comme l'environnement de requête IIS et la requête HTTP. Je n'ai jamais essayé d'héberger un ASP.Composant net dans un hôte EXE, je serais courageux si cela fonctionne. –

+0

@Remus: Je le fais en production dans mon application. Ce n'est pas l'hôte CLR; c'est simplement un second AppDomain créé par ASP.Net. – SLaks

+0

Je serai sacrément ... "Active l'hébergement des pages ASP.NET en dehors de l'application IIS (Internet Information Services) Cette classe permet à l'hôte de créer des domaines d'application pour le traitement des requêtes ASP.NET." ... Je ne savais pas que c'est possible, mais ça sonne comme si cela fonctionnait comme annoncé. Comment faites-vous la fausse «demande» au composant hébergé dans ce domaine d'application, et comment obtenez-vous la réponse? –

1

Je ne pense pas que ce soit possible mais vous pouvez vous charger du contrôle WebBroswer sur la page web asp.net.

0

Oui, cela devrait être possible. Pour rendre le moyen d'obtenir le html du contrôle, je ne sais pas comment vous allez utiliser ce HTML dans votre application.

+0

Cela ne répond pas à la question. – SLaks

+0

pouvez-vous expliquer un peu plus? – Shoban

3

Je n'ai pas pu obtenir la réponse populaire ici pour travailler. Ceci, cependant, semble fonctionner:

public string AspxToString(string aspx) 
{ 
    StringBuilder sb = new StringBuilder(); 
    using (StringWriter sw = new StringWriter(sb)) 
    { 
     using (HtmlTextWriter tw = new HtmlTextWriter(sw)) 
     { 
      var workerRequest = new SimpleWorkerRequest(aspx, "", tw); 
      HttpContext.Current = new HttpContext(workerRequest); 

      object view = BuildManager.CreateInstanceFromVirtualPath(aspx, typeof(object)); 

      Page viewPage = view as Page; 
      if (viewPage == null) 
      { 
       UserControl viewUserControl = view as UserControl; 
       if (viewUserControl != null) 
       { 
        viewPage = new Page(); 
        viewPage.Controls.Add(viewUserControl); 
       } 
      } 

      if (viewPage != null) 
      { 
       HttpContext.Current.Server.Execute(viewPage, tw, true); 

       return sb.ToString(); 
      } 

      throw new InvalidOperationException(); 
     } 
    } 
} 

Si vous utilisez ce à partir d'une application de bureau, vous aurez besoin d'un AppDomain, voir Is there a way to process an MVC view (aspx file) from a non-web application?

+0

l'astuce ici est que vous avez besoin de HttpContext.Current pour exister avant d'appeler le BuildManager –

Questions connexes