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