Страницы Blazor: как использовать BuildRenderTree для добавления динамического содержимого

Справочная информация: мы управляем десятками сайтов для клиентов; все используют идентичную базу кода (ASP.NET WebForms), но совершенно разные конструкции. Структура страницы генерируется программно из метаданных SQL Server с использованием таких элементов управления, как Panel, которые добавляются в коллекцию Controls страницы ASP.NET и становятся DIVs в обработанном HTML.

Цель: мы хотим в конечном итоге перейти на ASP.NET CORE. Однако, похоже, нет эквивалента коллекции элементов управления страницы. Ближайшее, что я могу найти, - это RenderTreeBuilder для добавления компонента Blazor.

Вопрос: Можно ли использовать BuildRenderTree для добавления компонента, содержащего наш домашний HTML (например, чтобы содержать все, что находится между <body> и </body>?

Я читал такие статьи, как:

https://chrissainty.com/building-components-via-rendertreebuilder/

https://docs.microsoft.com/en-us/aspnet/core/blazor/components?view=aspnetcore-3.1#manual-rendertreebuilder-logic

... и экспериментировал с добавлением элементов HTML, но это чрезвычайно громоздко, и я хотел бы программно сгенерировать HTML практически для всей страницы и добавить его как один RenderFragment (это правильный термин?).

Это возможно? Есть ли альтернатива?

Изменить:


Ответ @Henk, использующий структуру MarkupString, и мой, использующий RenderTreeBuilder.AddMarkupContent, кажутся похожими с точки зрения требуемых усилий и сантехники.

Есть ли плюсы и минусы двух подходов, которые мне следует рассмотреть?


person ChrisA    schedule 17.04.2020    source источник


Ответы (3)


Если вам просто нужен HTML (простой, мертвый), вам не нужно дерево рендеринга:

<h1>My Page</h1>
@MyHtmlComposer()

@code{
    private MarkupString MyHtmlComposer()
    {
        string html = "<p>Hello</p>";
        return new MarkupString(html);
    }
}
person Henk Holterman    schedule 19.04.2020

Я не сталкивался со структурой MarkupString, поэтому ответ @Henk действительно полезен. Я также столкнулся с методом RenderTreeBuilder.AddMarkupContent, поэтому предлагаю его в качестве альтернативного ответа:

Моя разметка:

@page "/"
<PageBuilder></PageBuilder>

PageBuilder - это класс, унаследованный от ComponentBase:

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>";
    }

Я немного отредактирую свой исходный вопрос, так как мне хотелось бы знать, есть ли что-нибудь, чтобы выбрать между этим подходом и подходом @Henk.

person ChrisA    schedule 20.04.2020

Вы также можете отобразить строку как HTML следующим образом:

@page "/test";
<h1>My Page</h1>

@((MarkupString)content)


@code{
    //Get content from Database
    string content = "<p>Hello</p>";
}

См. Раздел «Необработанный HTML» здесь

person Greg Gum    schedule 13.11.2020