Страницы Blazor: как использовать BuildRenderTree для добавления динамического c контента - PullRequest
0 голосов
/ 17 апреля 2020

Справочная информация : у нас работают десятки сайтов для клиентов; все используют одинаковую кодовую базу (ASP. NET WebForms), но совершенно разные дизайны. Структура страницы генерируется программным путем из SQL метаданных сервера с использованием таких элементов управления, как 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-logi c

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

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

Править :


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

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

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Если вы просто хотите HTML (обычный, мертвый), вам не нужно дерево визуализации:

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

@code{
    private MarkupString MyHtmlComposer()
    {
        string html = "<p>Hello</p>";
        return new MarkupString(html);
    }
}
0 голосов
/ 20 апреля 2020

Я не сталкивался со структурой MarkupString, поэтому ответ @ Хенка действительно полезен. Я также натолкнулся на метод 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's.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...