2010-05-25 5 views
0

Dans un projet pour lequel je travaille actuellement, nous avons découvert plusieurs types de contrôles de présentation des résultats de recherche. Les résultats de la recherche sont similaires, mais pas identiques. Par exemple, dans le résultat "recherche de bureau", nous pourrions vouloir présenter le nom et l'emplacement du bureau, tandis que dans la "recherche documentaire" pourrait contenir le nom du document, l'auteur et la date de publication. Ces champs devraient être triables.Création d'un contrôle Web de résultats de recherche génériques

Ma stratégie actuelle est d'utiliser le modèle d'usine et faire quelque chose comme ceci:

ISearchResult officeResults = SearchResultFactory.CreateOfficeSearchResults(data); 
ISearchResult documentResults = SearchResultFactory.CreateDocumentSearchResults(data); 

Le problème est: Je ne sais pas comment mettre en œuvre le code de balisage. Dois-je juste faire

Controls.Add(officeResults); 

dans la page contenant? Ou y a-t-il une astuce ASPX pour créer des contrôles web génériques? Ou peut-être que j'y pense trop et que je devrais créer cinq classes? ;)

Répondre

1
Controls.Add(officeResults); 

Est bien. Vous avez juste besoin de vous assurer que c'est un WebControl (c'est-à-dire qu'il hérite de WebControl). En fait, un "Contrôle" est ce qui est attendu, mais personnellement, si j'écris un "contrôle web", je vais utiliser/hériter de WebControl.

Je l'ai trouvé il est utile de l'ajouter « deux fois »:

Controls.Add(officeResults); // adds the control to the page (or parent controls) object collection. 
myPanel.Controls.Add(officeResults); // adds the control to where you want it to appear. 

Une fois le contrôle parent/page (dans le sens structurel exécutable), puis une fois au conteneur que je veux qu'il apparaisse dans (dans le sens visuel/physique hiérarchique). J'ai remarqué que les postbacks avaient tendance à fonctionner comme prévu quand j'ai fait cela - mais c'était peut-être parce que je faisais autre chose de mal à ce moment-là. Je suis sûr que d'autres me corrigeront si je le suis.

Je vous conseille également d'utiliser l'interface INamingContainer (vous n'avez pas besoin d'ajouter de code, il le fait tout seul au moment de l'exécution).

Je ne suis pas sûr d'utiliser une usine - je ne dis pas que c'est faux, mais généralement si j'ajoute un contrôle à une page (même dynamiquement), je saurai lequel je veux. Les TextBoxes, les Boutons et les Tables sont des WebControls et vous ne pouvez pas les construire/les ajouter via une Usine (du moins pas que je l'ai déjà vu, ou je me suis senti obligé de le faire). Si vous deviez utiliser une usine, ne posséderiez-vous pas une méthode d'usine qui déterminerait quel WebControl retourner en fonction d'un paramètre explicite, ou peut-être basé sur les données transmises?

Juste une pensée, j'espère que ça aide.

BTW, j'ai fait un peu de développement WebControl - je ne dis pas que je suis un expert mondial, mais vous pouvez trouver quelques idées utiles here: (regardez dans le "Morphfolia.Core" sln; dans le Morphfolia Projet .PublishingSystem, dossier WebControls et projet Morphfolia.WebControls).

+0

Des conseils très utiles, merci! Je ne savais pas sur INamingContainer, ça va être utile, je suis sûr :) –

Questions connexes