在寻找我的问题的解决方案的过程中,我发现 Blazor 页面不会向上游渲染,但我们可以使用 Mr. Steve Sanderson's approach 实现上游渲染。
但我对我的场景使用了另一种方法,如下所示:
创建了一个类并作为作用域注入:
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>