在 InteractiveServer(流式传输)模式下运行 Blazor 版本 8

问题描述 投票:0回答:1

我正在尝试将我的 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
是否错误,并且应该为每个组件设置它?这是一个组件,而不是页面设置 - 对吗?

我希望将其设置为全局,并且除非明确设置,否则所有内容都使用该设置。如果这不起作用,我想为每个页面和页面中的每个组件设置它,然后使用它(假设它没有明确配置不同)。

blazor blazor-server-side
1个回答
0
投票

最快显示页面的方法是设置 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模式下运行:

  1. App.razor
  2. 中设置根组件的渲染模式
  3. builder.Services.AddRazorComponents().AddInteractiveServerComponents()
    添加到服务以添加必要的服务。
  4. 添加
    app.MapRazorComponents<Blazr.App.UI.Components.App>().AddInteractiveServerRenderMode()
    以设置默认页面,并将
    InteractiveServer
    中间件添加到 Http 请求管道。

然后忘记它。

© www.soinside.com 2019 - 2024. All rights reserved.