Компоненты Razor: могу ли я создать несколько разделов (восходящий рендеринг) в основном макете?

#.net-core #blazor #razor-pages #blazor-webassembly #.net-5

#.net-core #blazor #razor-страницы #blazor-webassembly #.net-5

Вопрос:

В настоящее время я работаю над проектом в Blazor Web Assembly. Здесь я хочу создать блок / раздел sperate, в котором я могу отображать разные модальности начальной загрузки с разных страниц блейзора. Могу ли я достичь этого, создав новый класс компонентов макета, добавив новое свойство RenderFragment и наследовав от него?

Update1: возможно ли создать несколько разделов (как в asp.net/mvc бритва)?

Ответ №1:

Во время поиска решения моей проблемы я обнаружил, что Blazor pages не отображает восходящий рендеринг, но мы можем добиться восходящего рендеринга, используя подход мистера Стива Сандерсона.

Но я использовал другой подход для своего сценария, который заключается в следующем:

Создал класс и ввел в качестве области видимости:

 public interface IUIBlocks
{
    RenderFragment? ModalsBlock { get; }

    event EventHandler<OnUpdateEventArgs> OnValueUpdate;

    void SetModalsBlock(RenderFragment blockBody);
}

public class UIBlocks : IValueUpdator, IUIBlocks
{
    public RenderFragment? ModalsBlock { get; private set; }

    public event EventHandler<OnUpdateEventArgs> OnValueUpdate;

    public void SetModalsBlock(RenderFragment blockBody)
    {
        ModalsBlock = blockBody;
        OnValueUpdate?.Invoke(this, new OnUpdateEventArgs
        {
            CallerType = GetType(),
            CallingMethod = nameof(SetModalsBlock),
            CallingObject = this
        });
    }
}
 

В Program.cs:

 builder.Services.AddScoped<IUIBlocks, UIBlocks>();

                         
 

В mainLayout.razor был введен экземпляр UIBlocks и размещен ModalsBlock там, где я хотел, чтобы он был размещен

 @inject IUIBlocks BlocksService
...
</div>
@BlocksService.ModalsBlock
...
 

Теперь создал компонент Razor как ModalsBlock:

 @inject IUIBlocks Blocks



@code {
    [Parameter]
    public RenderFragment ChildContent { get; set; }
    protected override Task OnAfterRenderAsync(bool firstRender)
    {
        Blocks.SetModalsBlock(ChildContent);
        if (firstRender)
        {
        }

        return base.OnAfterRenderAsync(firstRender);
    }
}
 

и теперь я могу использовать его в любом компоненте Razor, подобном этому:

 <_ModalsBlock>
    <div class="modal fade>
    ...
    </div>
</_ModalsBlock>