Preventing double rendering with the combination of "Interactive Server Render Mode" and "Stream Rendering" – .net

by
Maya Patel
.net-4.8 asp.net-core-8 blazor blazor-server-side

Quick Fix: To avoid double rendering with "Interactive Server Render Mode" and "Stream Rendering", set the prerender parameter to false in the render mode initialization. This prevents the initial server-side rendering, providing a seamless transition between server and client rendering.

The Solutions:

Solution 1: Prevent the second render

To prevent the second render, we can use the data-permanent attribute on the element containing the data. This attribute tells the render engine not to clear the initial data, giving the perception of not being rendered twice.

Here’s an example:

<p data-permanent>@data</p>

With this attribute, the initial loading text will be displayed, and when the data becomes available, it will replace the loading text without causing a second render.

You can also prevent the first render by using the prerender parameter on the InteractiveServerRenderMode constructor. Setting this parameter to false will prevent the server from rendering the component on the initial request. Instead, the client will render the component when it receives the HTML response from the server.

Here’s an example:

@rendermode InteractiveServerRenderMode(prerender: false)

With this setting, the component will only be rendered once, when the client receives the HTML response from the server.

Note: This solution will only prevent the second render. It will not prevent the initial render of the component. If you want to prevent the initial render, you can use a different rendering mode, such as the ServerPrerendered mode.

Solution 2: Using an asynchronous `Task` for data initialization

To prevent the second rendering and maintain control over when the data is loaded and displayed, consider the following approach:

1. Remove the `[StreamRendering]` attribute from your component.
2. In the `OnInitializedAsync` method, start a new `Task` to initialize the `data` variable:
“`
protected override async Task OnInitializedAsync()
{
await Task.Run(async () =>
{
await Task.Delay(1000);
data = “Hello World!”;

         // Notify the component that the data has changed, triggering a re-render
         StateHasChanged();
     });
 }
 ```
  1. Use an if statement to conditionally display the loading text or the data based on whether the data has been initialized:
    “`
    @if (data == null)
    {

    Loading…

 }
 else
 {
     <p>@data</p>
 }
 ```

In this approach, the component initially renders without the data, displaying the loading text. Once the Task completes, the StateHasChanged method is called, triggering a re-render of the component with the updated data value. This prevents the component from rendering twice unnecessarily.

This solution offers a better separation of concerns by handling the data initialization and rendering separately. It also ensures that the component only re-renders when necessary, improving performance and user experience.

Solution 3: Prevent Rerendering with RenderMode and Prerendering

To resolve the issue of double rendering when using Stream Rendering and Interactive Server Render Mode, you can employ the following solution:

  1. Identify the Cause:

    • The second render occurs when a circuit connection establishes with the server after the initial data load.
    • By default, Blazor components in Interactive Server Render Mode prerender their content on the server before establishing a circuit connection.
  2. Add Prerendering Control:

    • To control the prerendering behavior, you can add the @rendermode directive with InteractiveAutoRenderMode(prerender: false) at the top of your component.
@attribute [StreamRendering]
@rendermode @(new InteractiveAutoRenderMode(prerender: false))

@if (data == null)
{
    <p>Loading...</p>
}
else
{
    <p>@data</p>
}

@code {
   private string? data;

    protected override async Task OnInitializedAsync()
    {
        await Task.Delay(1000);
        data = "Hello World!";
    }
}
  1. Understand the Effect:

    • By setting prerender to false, you disable the initial server-side rendering of the component.
    • The component will only render once when the circuit connection establishes, eliminating the double rendering issue.
  2. Consider Trade-offs:

    • While this solution prevents double rendering, it may slightly increase the initial load time since the component won’t be prerendered on the server.
    • It’s essential to weigh the trade-offs and choose the approach that best suits your application’s requirements.
  3. Explore Other Solutions:

    • If prerendering is crucial for your application’s performance, you may consider other solutions, such as optimizing the data loading process or using alternative rendering modes like Server-Side Blazor.

Remember to thoroughly test your application to ensure that the changes made do not introduce any unintended consequences or performance issues.

Solution 4: Using `InteractiveServerRenderMode` with `prerender` set to `false`

To prevent the second rendering, you can use the `InteractiveServerRenderMode` with the `prerender` property set to `false`. This will disable the initial server-side rendering of the component, ensuring that it’s rendered only once when the circuit connection is established. Here’s the modified code:

@attribute [StreamRendering]
@rendermode @(new InteractiveServerRenderMode(prerender: false))

@if (data == null)
{
    &lt;p&gt;Loading...&lt;/p&gt;
}
else
{
    &lt;p&gt;@data&lt;/p&gt;
}

@code {
   private string? data;

    protected override async Task OnInitializedAsync()
    {
        await Task.Delay(1000);
        data = &quot;Hello World!&quot;;
    }
}

With this change, the component will be rendered only once when the circuit connection is established, eliminating the issue of double rendering.

Q&A

How to prevent additional rerender of the component?

Add @rendermode @(new InteractiveServerRenderMode(prerender: false)) at the top of the component.

How to prevent the first render or tell render engine not to clear the initial data?

Apply data-permanent attribute to the element containing the data.

How to prevent the second rerender?

Prevent it by setting InteractiveServerRenderMode with prerender set to false.

Video Explanation:

The following video, titled "RealityCapture Free Webinar: Advanced workflow for a combination ...", provides additional insights and in-depth exploration related to the topics discussed in this post.

Play video

... Combination of photogrammetry and terrestrial laser scanning - General ... render 0:05:43 – Misalignment examples 0:08:45 – Data capture 0:09 ...