Contexte : Nous gérons des dizaines de sites pour des clients; tous utilisent une base de code identique (ASP.NET WebForms) mais des conceptions complètement différentes. La structure de page est générée par programme à partir des métadonnées SQL Server, à l'aide de contrôles tels que Panel
, qui sont ajoutés à la collection Controls
la page ASP.NET et deviennent des DIVs
dans le HTML rendu.
Objectif: nous souhaitons éventuellement migrer vers ASP.NET CORE. Cependant, il ne semble pas y avoir d'équivalent à la collection de contrôles de la page. La chose la plus proche que je puisse trouver est le RenderTreeBuilder pour ajouter un composant Blazor.
Question: Est-il possible d'utiliser BuildRenderTree
pour ajouter un composant qui contient notre HTML maison (par exemple, pour tout contenir entre <body>
et </body>
?
J'ai lu des articles tels que:
https://chrissainty.com/building-components-via-rendertreebuilder/
... et j'ai expérimenté l'ajout d'éléments HTML, mais c'est extrêmement fastidieux, et j'aimerais générer par programme le HTML pour à peu près toute la page, et l'ajouter en un seul RenderFragment
(est-ce le bon terme?).
Est-ce possible? Y a-t-il une alternative?
Éditer:
La réponse de @ Henk, utilisant la structure MarkupString
, et la mienne, utilisant RenderTreeBuilder.AddMarkupContent
semblent similaires en termes d'effort et de plomberie requis.
Y a-t-il des avantages et des inconvénients des deux approches que je devrais envisager?
3 Réponses :
Si vous voulez juste du HTML (brut, mort), vous n'avez pas besoin d'un rendu:
<h1>My Page</h1> @MyHtmlComposer() @code{ private MarkupString MyHtmlComposer() { string html = "<p>Hello</p>"; return new MarkupString(html); } }
Je n'avais pas rencontré la structure MarkupString
, donc la réponse de @ Henk est vraiment utile. Je suis maintenant tombé sur la méthode RenderTreeBuilder.AddMarkupContent
, je vais donc proposer ceci comme réponse alternative:
Mon balisage:
public class PageBuilder : ComponentBase { protected override void BuildRenderTree(RenderTreeBuilder b) { base.BuildRenderTree(b); b.OpenElement(0, "div"); b.AddMarkupContent(1, TheContent()); b.CloseElement(); } public string TheContent() { return "<div>This is the generated content</div>"; }
PageBuilder est une classe qui hérite de ComponentBase:
@page "/" <PageBuilder></PageBuilder>
Je modifierai un peu ma question initiale, car j'aimerais savoir s'il y a quelque chose à choisir entre cette approche et celle de @ Henk.
Vous pouvez également afficher une chaîne au format HTML comme ceci:
@page "/test"; <h1>My Page</h1> @((MarkupString)content) @code{ //Get content from Database string content = "<p>Hello</p>"; }
Voir la section "HTML brut" ici