预渲染不会保留用于捕获第二遍的变量值

2023-12-29

我查看了有关如何预渲染 Blazor 服务器应用程序然后分两次渲染的各种文章。我已经审查了生命周期,并且非常清楚这是预期的行为,主要是为了提供良好的性能。我不想关闭预渲染,所以在加载数据结构和类似的东西时我必须考虑它。

我需要能够运行与数据库交互一次的代码。我查看了各种应该有助于解决此问题的事件,但似乎没有一个起作用。

我看到的主要问题之一是,我用来记录第一遍的任何布尔变量都不会在第二遍期间保留该值,因此我无法使用它来避免重复工作。

换句话说,根据我的经验,第二遍的行为就好像第一遍从未发生过一样,因此第一遍中设置的任何内容在第二遍期间都不可用。

这使得管理双重渲染变得不可能。

如果我这样做,我最终会看到一个开发错误页面:

 protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        Console.WriteLine("Bink");
        //await OnInitializedAsync();
    }
    else
    {
        await Initialize();
    }
}

如果我这样做,在 If 语句中检查时 isInitialized 变量永远不会设置为 true。它总是错误的,所以看起来每个通道都完全独立于前一个通道,这不是我理解它的工作方式。:

 protected override async Task OnParametersSetAsync()
{
    if(isInitialized)
    {
        return;
    }
    isInitialized = true;
    await Initialize();
    //await base.OnParametersSetAsync();
}

如何实现一个只运行一次初始化代码同时保留两遍渲染的解决方案?我看到很多解决方案应该有效,但没有一个有效,那么我该如何解决这个问题?


第一个和第二个加载在两个不同的上下文中运行。他们唯一共享的是单例服务。

您可以使用以下方法检测负载IHttpContextAccessor.

将服务添加到Program:

builder.Services.AddHttpContextAccessor(); 

在任何页面或组件中,您都可以执行以下操作:

@page "/"
@inject IHttpContextAccessor HttpContextAccessor
<PageTitle>Index</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />

@code {
    private bool _isServerRender;

    protected override void OnInitialized()
        => _isServerRender = !(HttpContextAccessor.HttpContext is not null && HttpContextAccessor.HttpContext.Response.HasStarted);

    protected override Task OnInitializedAsync()
    {
        if (_isServerRender)
        {
            // Do minumum to dispay page
            return base.OnInitializedAsync();
        }

        // Do normal stuff
        return base.OnInitializedAsync();
    }
}

在哪里使用此代码取决于您想要实现的目标。你可以运行它Index,或者你可以运行它App并只显示加载屏幕。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预渲染不会保留用于捕获第二遍的变量值 的相关文章

随机推荐

  • 为什么Java的String.getBytes()使用“ISO-8859-1”

    来自 java lang StringCoding String csn charsetName null ISO 8859 1 charsetName 这是 Linux jdk 7 中 Java lang getBytes 使用的内容 我
  • Android - 检查设备是否连接到互联网

    有没有简单的方法 如何检查设备是否主动连接到互联网 通过 GPRS EDGE UMTS HSDPA 或 Wi Fi 连接 Thanks 是的 我使用 isReachable public class Extras public static
  • 仿真期间的 Modelica 输出文件

    我进行了很长时间的模拟 并且需要在模拟继续时检查输出 另一个原因是我正在进行实时模拟 所以我也想实时查看输出 如果 OpenModelica 在模拟过程中创建一个输出文件 以便我可以使用第 3 方工具 也许是 Python 读取并绘制它 那
  • 什么是定点整数?

    In http microformats org wiki hreview aggregate http microformats org wiki hreview aggregate it says rating 必需的 定点整数 1 0
  • ggplot2 中的条形图

    有人会帮助使用绘制条形图吗ggplot2对于此数据 我无法为此数据开发条形图 在 ggplot 中 您应该使数据采用更长的格式 为此你可以使用pivot longer from tidyr 这样你就可以创建一个像这样的堆积条形图 df lt
  • SQL Server 2008 - 当列为空时设置一个值

    我正在 SQL Server 2008 数据库上执行 SELECT 语句 SELECT Name DOB Address1 Address2 City State Zip FROM Users 但是 如果上述任何列对于特定行恰好为空 我想将
  • 刺尾没有优雅地退出

    我正在使用以下任一命令通过 Maven 运行 Thorntail 2 2 1 Final 微服务 mvn thorntail start mvn thorntail run 它运行良好 但是当我击中时Ctrl C它不会退出应用程序 即控制台
  • 循环遍历 xml 元素

    我有以下内容 aMyArray null xml userfile Get Content C AppSense Scripts AmPolicyConversion AM dev xml i 0 FOREACH j in userfile
  • numpy.ndarray 与 pandas.DataFrame

    我需要对程序中保存统计数据帧的数据结构基础的选择做出战略决策 我在一张大表中存储了数十万条记录 每个字段都有不同的类型 包括短字符串 我会对需要快速实时完成的数据进行多重回归分析和操作 我还需要使用一些相对流行且支持良好的东西 我知道以下参
  • 如何从通过 API 返回的 Task 获取值以进行单元测试

    我使用 ASP NET MVC Core v2 1 创建了一个 API 我的一个HttpGet方法设置如下 public async Task
  • MySQL按出现次数排序

    我正在两个名为的文本字段中进行搜索Subject and Text对于特定的关键字 为此 我使用LIKE陈述 我在尝试按出现次数对结果进行排序时遇到了问题 我的搜索查询如下所示 SELECT FROM Table WHERE Text LI
  • 在 Gnuplot 中,如何在第三列等于 0 时使点为一种颜色,否则为另一种颜色?

    我需要根据一列中的颜色改变一行值的点颜色 数据 x y z 1 3 0 1 5 6 3 5 2 4 5 0 如果该列为零 则颜色应为一个值 如果第三列中的值非零 则颜色应为不同的颜色 所以 我假设 plot file dat u 1 2 3
  • 在 Linux 中删除文件名中的空格[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我在不同的文件夹中有数百个 jpg 文件 如下所示 304775 105 01 jpg 304775 105 03 jpg 304775 105 05
  • DUAL 的魔力

    正常情况下 不使用SYS或者也许使用它 SQL gt select from dual D X 在不太正常的条件下 连接为SYS SQL gt alter database close Statement processed SQL gt
  • WPF 树视图蓝调。我想选择一个项目

    我正在尝试选择一个 TreeViewItem 现在 我可以访问包含的 TreeViewItem 并告诉它展开 以便我可以选择它的孩子 如果它已经展开 一切都很好 如果没有 那么我运行以下代码 EventHandler selector ne
  • MYSQL LEFT JOIN 与 CASE 优化

    我花了一些时间尝试使用 CASE 来处理这个 SELECT 但我失败了 感谢我现在正在使用 COLASCE 如何使用 CASE IF 语句优化此 SELECT 这是从字段选择的不同表中查询的快速方法吗 SELECT a folderid a
  • 将 Eclipse 从 Indigo 升级到 Juno 时我可以保留我的设置吗?

    如何将 Eclipse 从 Indigo 升级到 Juno 而不会丢失所有自定义设置 我尝试了两种不同的方法 但都不起作用 从 Indigo 导出首选项并导入 Juno 在 Indigo 工作区的副本上运行 Juno 每次升级都得从头开始真
  • .Net:如何创建独立于供应商的数据集、表适配器、绑定(数据库在运行时决定)

    我有一个 C Windows 窗体应用程序 其原型是在 SQL Server 强类型数据集 上创建的 在其最终版本中 应用程序必须能够在 SQL Server MySQL 或 Oracle 上运行 现在我想知道原型中的哪些部分 如果有 可以
  • MongoDB 5.0+ 需要支持 AVX 的 CPU。容器启动失败

    我正在尝试使用 docker compose 文件在 docker 容器中运行 mongo 6 但它总是退出并出现警告 Docker 版本 23 0 4 内部版本 f480fb1 Docker compose版本 v2 17 2 docke
  • 预渲染不会保留用于捕获第二遍的变量值

    我查看了有关如何预渲染 Blazor 服务器应用程序然后分两次渲染的各种文章 我已经审查了生命周期 并且非常清楚这是预期的行为 主要是为了提供良好的性能 我不想关闭预渲染 所以在加载数据结构和类似的东西时我必须考虑它 我需要能够运行与数据库