我正在尝试将我的 Blazor 服务器端(版本 6/7)应用程序转换为版本 8。我想继续在服务器模式下使用 InteractiveServer,而不是 InteractiveAuto。
最快显示页面的方法是设置 StreamRendering(true) - 正确吗?
然后这将调用
OnInitializedAsync()
两次,我在第一次调用时快速执行任何操作,并在第二次调用时访问数据库 - 对吗?
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
[Inject]
private ILogger<Counter>? Logger { get; set; }
private int currentCount = 0;
/// <inheritdoc />
protected override Task OnInitializedAsync()
{
bool firstRender = !(HttpContext is null);
Logger.LogInformation($"firstRender = {firstRender}");
return base.OnInitializedAsync();
}
在这种情况下,我可以让它工作的唯一方法是将以下内容放在 razor 文件 (Counter.razor) 的顶部:
@attribute [StreamRendering(true)]
@rendermode InteractiveServer
我在 App.razor 中尝试了以下操作,但没有任何区别。仍然需要
@rendermode
。为什么?
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="/" />
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
<link rel="stylesheet" href="app.css" />
<link rel="stylesheet" href="Blazor_Ver8.styles.css" />
<link rel="icon" type="image/png" href="favicon.png" />
<HeadOutlet @rendermode="InteractiveServer" />
</head>
<body>
<Routes @rendermode="InteractiveServer" />
<script src="_framework/blazor.web.js"></script>
</body>
我在 Program.cs 中有以下内容。如果未显式设置
@rendermode="InteractiveServer"
,是否会设置 @rendermode
?
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
最后一个问题 - 我尝试在全局范围内设置
@attribute [StreamRendering(true)]
和 @rendermode InteractiveServer
是否错误,并且应该为每个组件设置它?这是一个组件,而不是页面设置 - 对吗?
我希望将其设置为全局,并且除非明确设置,否则所有内容都使用该设置。如果这不起作用,我想为每个页面和页面中的每个组件设置它,然后使用它(假设它没有明确配置不同)。
最快显示页面的方法是设置 StreamRendering(true) - 正确吗?
如果您在 InteractiveServer 全局中运行,请忘记
StreamRendering
。
然后这将调用 OnInitializedAsync() 两次,我在第一次调用时快速执行任何操作,并在第二次调用时访问数据库 - 正确吗?
是的。
<HeadOutlet @rendermode="InteractiveServer" />
</head>
<body>
<Routes @rendermode="InteractiveServer" />
<script src="_framework/blazor.web.js"></script>
</body>
将使一切
InteractiveServer
。
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
只需添加运行
InteractiveServer
所需的所有服务。它不设置应用程序模式。
最后一个问题 - 我尝试在全局范围内设置 @attribute [StreamRendering(true)] 和 @rendermode InteractiveServer 是否错误,并且应该为每个组件设置它?这是一个组件,而不是页面设置 - 对吗?
如果设置为
Routes
,则应覆盖所有子组件设置。
本质上,要在旧的Server模式下运行:
App.razor
builder.Services.AddRazorComponents().AddInteractiveServerComponents()
添加到服务以添加必要的服务。app.MapRazorComponents<Blazr.App.UI.Components.App>().AddInteractiveServerRenderMode()
以设置默认页面,并将 InteractiveServer
中间件添加到 Http 请求管道。然后忘记它。