diff --git a/aspnetcore/blazor/advanced-scenarios.md b/aspnetcore/blazor/advanced-scenarios.md
index a7d30c890927..bb107273e078 100644
--- a/aspnetcore/blazor/advanced-scenarios.md
+++ b/aspnetcore/blazor/advanced-scenarios.md
@@ -5,7 +5,7 @@ description: Learn how to incorporate manual logic for building Blazor render tr
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/advanced-scenarios
---
# ASP.NET Core Blazor advanced scenarios (render tree construction)
diff --git a/aspnetcore/blazor/blazor-ef-core.md b/aspnetcore/blazor/blazor-ef-core.md
index ce4204f9fb60..03b0ef4930ab 100644
--- a/aspnetcore/blazor/blazor-ef-core.md
+++ b/aspnetcore/blazor/blazor-ef-core.md
@@ -5,7 +5,7 @@ description: Learn how to use Entity Framework Core (EF Core) in Blazor apps.
monikerRange: '>= aspnetcore-3.1'
ms.author: jeliknes
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/blazor-ef-core
---
# ASP.NET Core Blazor with Entity Framework Core (EF Core)
diff --git a/aspnetcore/blazor/call-web-api.md b/aspnetcore/blazor/call-web-api.md
index 8b1ac24f5afa..a446f9155d76 100644
--- a/aspnetcore/blazor/call-web-api.md
+++ b/aspnetcore/blazor/call-web-api.md
@@ -5,7 +5,7 @@ description: Learn how to call a web API from Blazor apps.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 03/08/2024
+ms.date: 11/12/2024
uid: blazor/call-web-api
---
# Call a web API from ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/components/built-in-components.md b/aspnetcore/blazor/components/built-in-components.md
index 6bad093133ca..2bd4b5fcdf9c 100644
--- a/aspnetcore/blazor/components/built-in-components.md
+++ b/aspnetcore/blazor/components/built-in-components.md
@@ -5,7 +5,7 @@ description: Find information on Razor components provided by the Blazor framewo
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/built-in-components
---
# ASP.NET Core built-in Razor components
diff --git a/aspnetcore/blazor/components/cascading-values-and-parameters.md b/aspnetcore/blazor/components/cascading-values-and-parameters.md
index dcd6efa16d71..443814c3e863 100644
--- a/aspnetcore/blazor/components/cascading-values-and-parameters.md
+++ b/aspnetcore/blazor/components/cascading-values-and-parameters.md
@@ -5,7 +5,7 @@ description: Learn how to flow data from an ancestor Razor component to descende
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 07/19/2024
+ms.date: 11/12/2024
uid: blazor/components/cascading-values-and-parameters
---
# ASP.NET Core Blazor cascading values and parameters
diff --git a/aspnetcore/blazor/components/class-libraries-and-static-server-side-rendering.md b/aspnetcore/blazor/components/class-libraries-and-static-server-side-rendering.md
index 32673c24c7c0..4cc2a55bfea5 100644
--- a/aspnetcore/blazor/components/class-libraries-and-static-server-side-rendering.md
+++ b/aspnetcore/blazor/components/class-libraries-and-static-server-side-rendering.md
@@ -5,7 +5,7 @@ description: Learn how component authors can support static server-side renderin
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/class-libraries-with-static-ssr
---
# ASP.NET Core Razor class libraries (RCLs) with static server-side rendering (static SSR)
diff --git a/aspnetcore/blazor/components/class-libraries.md b/aspnetcore/blazor/components/class-libraries.md
index a1246a2290b0..0ebcf58fde6c 100644
--- a/aspnetcore/blazor/components/class-libraries.md
+++ b/aspnetcore/blazor/components/class-libraries.md
@@ -5,7 +5,7 @@ description: Discover how components can be included in Blazor apps from an exte
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/class-libraries
---
# Consume ASP.NET Core Razor components from a Razor class library (RCL)
diff --git a/aspnetcore/blazor/components/control-head-content.md b/aspnetcore/blazor/components/control-head-content.md
index b032142f539b..cad5eeeb6385 100644
--- a/aspnetcore/blazor/components/control-head-content.md
+++ b/aspnetcore/blazor/components/control-head-content.md
@@ -5,7 +5,7 @@ description: Learn how to control head content in Blazor apps, including how to
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/control-head-content
---
# Control `
` content in ASP.NET Core Blazor apps
diff --git a/aspnetcore/blazor/components/css-isolation.md b/aspnetcore/blazor/components/css-isolation.md
index 43e8aa5046ea..b09f873c418c 100644
--- a/aspnetcore/blazor/components/css-isolation.md
+++ b/aspnetcore/blazor/components/css-isolation.md
@@ -5,7 +5,7 @@ description: Learn how CSS isolation scopes CSS to Razor components, which can s
monikerRange: '>= aspnetcore-5.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/css-isolation
---
# ASP.NET Core Blazor CSS isolation
diff --git a/aspnetcore/blazor/components/data-binding.md b/aspnetcore/blazor/components/data-binding.md
index b51e078168a6..a2b21f1eae5e 100644
--- a/aspnetcore/blazor/components/data-binding.md
+++ b/aspnetcore/blazor/components/data-binding.md
@@ -5,7 +5,7 @@ description: Learn about data binding features for Razor components and DOM elem
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/data-binding
---
# ASP.NET Core Blazor data binding
diff --git a/aspnetcore/blazor/components/dynamiccomponent.md b/aspnetcore/blazor/components/dynamiccomponent.md
index 4f513ce6d7b3..451e78fe1a79 100644
--- a/aspnetcore/blazor/components/dynamiccomponent.md
+++ b/aspnetcore/blazor/components/dynamiccomponent.md
@@ -5,7 +5,7 @@ description: Learn how to use dynamically-rendered Razor components in Blazor ap
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/dynamiccomponent
---
# Dynamically-rendered ASP.NET Core Razor components
diff --git a/aspnetcore/blazor/components/element-component-model-relationships.md b/aspnetcore/blazor/components/element-component-model-relationships.md
index 2bd98948b749..e7c3315cfc6f 100644
--- a/aspnetcore/blazor/components/element-component-model-relationships.md
+++ b/aspnetcore/blazor/components/element-component-model-relationships.md
@@ -5,7 +5,7 @@ description: Learn how to use the @key directive attribute to retain element, co
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/key
---
# Retain element, component, and model relationships in ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/components/event-handling.md b/aspnetcore/blazor/components/event-handling.md
index a38b975f0fca..90bbcd2410ad 100644
--- a/aspnetcore/blazor/components/event-handling.md
+++ b/aspnetcore/blazor/components/event-handling.md
@@ -5,7 +5,7 @@ description: Learn about Blazor's event handling features, including event argum
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/event-handling
---
# ASP.NET Core Blazor event handling
diff --git a/aspnetcore/blazor/components/generic-type-support.md b/aspnetcore/blazor/components/generic-type-support.md
index d8538ca39b41..edcb0abe0f2f 100644
--- a/aspnetcore/blazor/components/generic-type-support.md
+++ b/aspnetcore/blazor/components/generic-type-support.md
@@ -5,7 +5,7 @@ description: Learn about generic type support in ASP.NET Core Razor components.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 04/10/2024
+ms.date: 11/12/2024
uid: blazor/components/generic-type-support
---
# ASP.NET Core Razor component generic type support
diff --git a/aspnetcore/blazor/components/index.md b/aspnetcore/blazor/components/index.md
index 79ffc9fc7466..7007e486608d 100644
--- a/aspnetcore/blazor/components/index.md
+++ b/aspnetcore/blazor/components/index.md
@@ -5,7 +5,7 @@ description: Learn how to create and use Razor components in Blazor apps, includ
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 07/19/2024
+ms.date: 11/12/2024
uid: blazor/components/index
---
# ASP.NET Core Razor components
diff --git a/aspnetcore/blazor/components/integration-hosted-webassembly.md b/aspnetcore/blazor/components/integration-hosted-webassembly.md
new file mode 100644
index 000000000000..4b4b099c3836
--- /dev/null
+++ b/aspnetcore/blazor/components/integration-hosted-webassembly.md
@@ -0,0 +1,1343 @@
+---
+title: Integrate ASP.NET Core Razor components with MVC or Razor Pages in hosted Blazor WebAssembly solutions
+author: guardrex
+description: Learn about Razor component integration scenarios for hosted Blazor WebAssembly apps with MVC or Razor Pages, including prerendering of Razor components on the server.
+monikerRange: '>= aspnetcore-3.1 < aspnetcore-8.0'
+ms.author: riande
+ms.custom: mvc
+ms.date: 11/12/2024
+uid: blazor/components/integration-hosted-webassembly
+---
+# Integrate ASP.NET Core Razor components with MVC or Razor Pages in hosted Blazor WebAssembly solutions
+
+> [!NOTE]
+> Hosted Blazor WebAssembly solutions remain supported, but the project template was removed and is no longer supported in .NET 8 or later. This article appears in the table of contents up to .NET 7 for reference, but note that .NET 7 is a [Standard Support Term](https://dotnet.microsoft.com/platform/support/policy/dotnet-core) release that's no longer supported.
+
+:::moniker range="= aspnetcore-7.0 || = aspnetcore-5.0 || = aspnetcore-3.0 || = aspnetcore-3.1 || = aspnetcore-2.0"
+
+> [!WARNING]
+> This version of ASP.NET Core is no longer supported. For more information, see the [.NET and .NET Core Support Policy](https://dotnet.microsoft.com/platform/support/policy/dotnet-core).
+
+:::moniker-end
+
+This article explains Razor component integration scenarios for hosted Blazor WebAssembly apps, including prerendering of Razor components on the server.
+
+> [!IMPORTANT]
+> Framework changes across ASP.NET Core releases led to different sets of instructions in this article. Before using this article's guidance, confirm that the document version selector at the top of this article matches the version of ASP.NET Core that you intend to use for your app.
+
+:::moniker range=">= aspnetcore-7.0"
+
+Prerendering can improve [Search Engine Optimization (SEO)](https://developer.mozilla.org/docs/Glossary/SEO) by rendering content for the initial HTTP response that search engines can use to calculate page rank.
+
+## Solution configuration
+
+### Prerendering configuration
+
+To set up prerendering for a hosted Blazor WebAssembly app:
+
+1. Host the Blazor WebAssembly app in an ASP.NET Core app. A standalone Blazor WebAssembly app can be added to an ASP.NET Core solution, or you can use a hosted Blazor WebAssembly app created from the [Blazor WebAssembly project template](xref:blazor/tooling) with the hosted option:
+
+ * Visual Studio: In the **Additional information** dialog, select the **ASP.NET Core Hosted** checkbox when creating the Blazor WebAssembly app. In this article's examples, the solution is named `BlazorHosted`.
+ * Visual Studio Code/.NET CLI command shell: `dotnet new blazorwasm -ho` (use the `-ho|--hosted` option). Use the `-o|--output {LOCATION}` option to create a folder for the solution and set the solution's project namespaces. In this article's examples, the solution is named `BlazorHosted` (`dotnet new blazorwasm -ho -o BlazorHosted`).
+
+ For the examples in this article, the hosted solution's name (assembly name) is `BlazorHosted`. The client project's namespace is `BlazorHosted.Client`, and the server project's namespace is `BlazorHosted.Server`.
+
+1. **Delete** the `wwwroot/index.html` file from the Blazor WebAssembly **:::no-loc text="Client":::** project.
+
+1. In the **:::no-loc text="Client":::** project, **delete** the following lines in `Program.cs`:
+
+ ```diff
+ - builder.RootComponents.Add("#app");
+ - builder.RootComponents.Add("head::after");
+ ```
+
+1. Add `_Host.cshtml` file to the **:::no-loc text="Server":::** project's `Pages` folder. You can obtain the files from a project created from the Blazor Server template using Visual Studio or using the .NET CLI with the `dotnet new blazorserver -o BlazorServer` command in a command shell (the `-o BlazorServer` option creates a folder for the project). After placing the files into the **:::no-loc text="Server":::** project's `Pages` folder, make the following changes to the files.
+
+ Make the following changes to the `_Host.cshtml` file:
+
+ * Update the `Pages` namespace at the top of the file to match the namespace of the **:::no-loc text="Server":::** app's pages. The `{APP NAMESPACE}` placeholder in the following example represents the namespace of the donor app's pages that provided the `_Host.cshtml` file:
+
+ Delete:
+
+ ```diff
+ - @namespace {APP NAMESPACE}.Pages
+ ```
+
+ Add:
+
+ ```razor
+ @namespace BlazorHosted.Server.Pages
+ ```
+
+ * Add an [`@using`](xref:mvc/views/razor#using) directive for the **:::no-loc text="Client":::** project at the top of the file:
+
+ ```razor
+ @using BlazorHosted.Client
+ ```
+
+ * Update the stylesheet links to point to the WebAssembly project's stylesheets. In the following example, the client project's namespace is `BlazorHosted.Client`. The `{APP NAMESPACE}` placeholder represents the namespace of the donor app that provided the `_Host.cshtml` file. Update the Component Tag Helper (`` tag) for the `HeadOutlet` component to prerender the component.
+
+ Delete:
+
+ ```diff
+ -
+ -
+ -
+ ```
+
+ Add:
+
+ ```cshtml
+
+
+
+ ```
+
+ > [!NOTE]
+ > Leave the ` ` element that requests the Bootstrap stylesheet (`css/bootstrap/bootstrap.min.css`) in place.
+
+ * Update the Blazor script source to use the client-side Blazor WebAssembly script:
+
+ Delete:
+
+ ```diff
+ -
+ ```
+
+ Add:
+
+ ```html
+
+ ```
+
+ * Update the `render-mode` of the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) to prerender the root `App` component with :
+
+ Delete:
+
+ ```diff
+ -
+ ```
+
+ Add:
+
+ ```cshtml
+
+ ```
+
+ > [!IMPORTANT]
+ > Prerendering isn't supported for authentication endpoints (`/authentication/` path segment). For more information, see .
+
+1. In the `Program.cs` file of the **:::no-loc text="Server":::** project, change the fallback endpoint from the `index.html` file to the `_Host.cshtml` page:
+
+ Delete:
+
+ ```diff
+ - app.MapFallbackToFile("index.html");
+ ```
+
+ Add:
+
+ ```csharp
+ app.MapFallbackToPage("/_Host");
+ ```
+
+1. If the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** projects use one or more common services during prerendering, factor the service registrations into a method that can be called from both projects. For more information, see .
+
+1. Run the **:::no-loc text="Server":::** project. The hosted Blazor WebAssembly app is prerendered by the **:::no-loc text="Server":::** project for clients.
+
+### Configuration for embedding Razor components into pages or views
+
+The following sections and examples for embedding Razor components from the **:::no-loc text="Client":::** Blazor WebAssembly app into pages or views of the server app require additional configuration.
+
+The **:::no-loc text="Server":::** project must have the following files and folders.
+
+Razor Pages:
+
+* `Pages/Shared/_Layout.cshtml`
+* `Pages/Shared/_Layout.cshtml.css`
+* `Pages/_ViewImports.cshtml`
+* `Pages/_ViewStart.cshtml`
+
+MVC:
+
+* `Views/Shared/_Layout.cshtml`
+* `Views/Shared/_Layout.cshtml.css`
+* `Views/_ViewImports.cshtml`
+* `Views/_ViewStart.cshtml`
+
+The preceding files can be obtained by generating an app from the ASP.NET Core project templates using:
+
+* Visual Studio's new project creation tools.
+* Opening a command shell and executing `dotnet new webapp -o {PROJECT NAME}` (Razor Pages) or `dotnet new mvc -o {PROJECT NAME}` (MVC). The option `-o|--output` with a value for the `{PROJECT NAME}` placeholder provides a name for the app and creates a folder for the app.
+
+Update the namespaces in the imported `_ViewImports.cshtml` file to match those in use by the **:::no-loc text="Server":::** project receiving the files.
+
+`Pages/_ViewImports.cshtml` (Razor Pages):
+
+```razor
+@using BlazorHosted.Server
+@namespace BlazorHosted.Server.Pages
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+```
+
+`Views/_ViewImports.cshtml` (MVC):
+
+```razor
+@using BlazorHosted.Server
+@using BlazorHosted.Server.Models
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+```
+
+Update the imported layout file, which is `Pages/Shared/_Layout.cshtml` for Razor Pages or `Views/Shared/_Layout.cshtml` for MVC.
+
+First, delete the title and the stylesheet from the donor project, which is `RPDonor.styles.css` in the following example. The `{PROJECT NAME}` placeholder represents the donor project's app name.
+
+```diff
+- @ViewData["Title"] - {PROJECT NAME}
+-
+```
+
+Include the **:::no-loc text="Client":::** project's styles in the layout file. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`. The `` element can be updated at the same time.
+
+Place the following lines in the `` content of the layout file:
+
+```cshtml
+@ViewData["Title"] - BlazorHosted
+
+
+
+```
+
+The imported layout contains two `Home` (`Index` page) and `Privacy` navigation links. To make the `Home` links point to the hosted Blazor WebAssembly app, change the hyperlinks:
+
+```diff
+- {PROJECT NAME}
++ BlazorHosted
+```
+
+```diff
+- Home
++ Home
+```
+
+In an MVC layout file:
+
+```diff
+- {PROJECT NAME}
++ BlazorHosted
+```
+
+```diff
+- Home
++ Home
+```
+
+Update the `` element's app name. The following example uses the app name `BlazorHosted`:
+
+```diff
+- © {DATE} - {DONOR NAME} - Privacy
++ © {DATE} - BlazorHosted - Privacy
+```
+
+In the preceding example, the `{DATE}` placeholder represents the copyright date in an app generated from the Razor Pages or MVC project template.
+
+To make the `Privacy` link lead to a privacy page (Razor Pages), add a privacy page to the **:::no-loc text="Server":::** project.
+
+`Pages/Privacy.cshtml` in the **:::no-loc text="Server":::** project:
+
+```cshtml
+@page
+@model PrivacyModel
+@{
+ ViewData["Title"] = "Privacy Policy";
+}
+@ViewData["Title"]
+
+Use this page to detail your site's privacy policy.
+```
+
+For an MVC-based privacy view, create a privacy view in the **:::no-loc text="Server":::** project.
+
+`View/Home/Privacy.cshtml` in the **:::no-loc text="Server":::** project:
+
+```cshtml
+@{
+ ViewData["Title"] = "Privacy Policy";
+}
+@ViewData["Title"]
+
+Use this page to detail your site's privacy policy.
+```
+
+In the `Home` controller of the MVC app, return the view.
+
+Add the following code to `Controllers/HomeController.cs`:
+
+```csharp
+public IActionResult Privacy()
+{
+ return View();
+}
+```
+
+If you import files from a donor app, be sure to update any namespaces in the files to match that of the **:::no-loc text="Server":::** project (for example, `BlazorHosted.Server`).
+
+Import static assets to the **:::no-loc text="Server":::** project from the donor project's `wwwroot` folder:
+
+* `wwwroot/css` folder and contents
+* `wwwroot/js` folder and contents
+* `wwwroot/lib` folder and contents
+
+If the donor project is created from an ASP.NET Core project template and the files aren't modified, you can copy the entire `wwwroot` folder from the donor project into the **:::no-loc text="Server":::** project and remove the :::no-loc text="favicon"::: icon file.
+
+> [!WARNING]
+> Avoid placing the static asset into both the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** `wwwroot` folders. If the same file is present in both folders, an exception is thrown because the static assets share the same web root path. Therefore, host a static asset in either of the `wwwroot` folders, not both.
+
+After adopting the preceding configuration, embed Razor components into pages or views of the **:::no-loc text="Server":::** project. Use the guidance in the following sections of this article:
+
+* *Render components in a page or view with the Component Tag Helper*
+* *Render components in a page or view with a CSS selector*
+
+## Render components in a page or view with the Component Tag Helper
+
+After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-or-views), the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) supports two render modes for rendering a component from a Blazor WebAssembly app in a page or view:
+
+*
+*
+
+In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections). To avoid using the full namespace for the `Counter` component with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) (`{ASSEMBLY NAME}.Pages.Counter`), add an [`@using`](xref:mvc/views/razor#using) directive for the client project's `Pages` namespace. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
+
+In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter1.cshtml`:
+
+```cshtml
+@page
+@using BlazorHosted.Client.Pages
+
+
+
+@section Scripts {
+
+}
+```
+
+Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter1`. The prerendered `Counter` component is embedded in the page.
+
+ configures whether the component:
+
+* Is prerendered into the page.
+* Is rendered as static HTML on the page or if it includes the necessary information to bootstrap a Blazor app from the user agent.
+
+For more information on the Component Tag Helper, including passing parameters and configuration, see .
+
+Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
+
+### Set child content through a render fragment
+
+The [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) doesn't support receiving a [`RenderFragment` delegate for child content](xref:blazor/components/index#child-content-render-fragments) (for example, `param-ChildContent="..."`). We recommend creating a Razor component (`.razor`) that references the component you want to render with the child content you want to pass and then invoke the Razor component from the page or view.
+
+### Ensure that top-level prerendered components aren't trimmed out on publish
+
+If a [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) directly references a component from a library that's subject to trimming on publish, the component might be trimmed out during publish because there are no references to it from client-side app code. As a result, the component isn't prerendered, leaving a blank spot in the output. If this occurs, instruct the trimmer to preserve the library component by adding a [`DynamicDependency` attribute](xref:System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute) to any class in the client-side app. To preserve a component called `SomeLibraryComponentToBePreserved`, add the following to any component:
+
+```razor
+@using System.Diagnostics.CodeAnalysis
+@attribute [DynamicDependency(DynamicallyAccessedMemberTypes.All,
+ typeof(SomeLibraryComponentToBePreserved))]
+```
+
+The preceding approach usually isn't required because the app usually prerenders its components (which are not trimmed), which in turn references components from libraries (causing them also not to be trimmed). Only use `DynamicDependency` explicitly for prerendering a library component directly when the library is subject to trimming.
+
+## Render components in a page or view with a CSS selector
+
+After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-or-views), add root components to the **:::no-loc text="Client":::** project of a hosted Blazor WebAssembly solution in the `Program.cs` file. In the following example, the `Counter` component is declared as a root component with a CSS selector that selects the element with the `id` that matches `counter-component`. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
+
+In `Program.cs` file of the **:::no-loc text="Client":::** project, add the namespace for the project's Razor components to the top of the file:
+
+```csharp
+using BlazorHosted.Client.Pages;
+```
+
+After the `builder` is established in `Program.cs`, add the `Counter` component as a root component:
+
+```csharp
+builder.RootComponents.Add("#counter-component");
+```
+
+In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections).
+
+In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter2.cshtml`:
+
+```cshtml
+@page
+
+Loading...
+
+@section Scripts {
+
+}
+```
+
+Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter2`. The prerendered `Counter` component is embedded in the page.
+
+Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
+
+> [!NOTE]
+> The preceding example throws a if a Blazor WebAssembly app is prerendered and integrated into a Razor Pages or MVC app **simultaneously** with the use of a CSS selector. Navigating to one of the **:::no-loc text="Client":::** project's Razor components or navigating to a page or view of the **:::no-loc text="Server":::** with an embedded component throws one or more .
+>
+> This is normal behavior because prerendering and integrating a Blazor WebAssembly app with routable Razor components is incompatible with the use of CSS selectors.
+>
+> If you've been working with the examples in the preceding sections and just wish to see the CSS selector work in your sample app, comment out the specification of the `App` root component of the **:::no-loc text="Client":::** project's `Program.cs` file:
+>
+> ```diff
+> - builder.RootComponents.Add("#app");
+> + //builder.RootComponents.Add("#app");
+> ```
+>
+> Navigate to the page or view with the embedded Razor component that uses a CSS selector (for example, `/razorpagescounter2` of the preceding example). The page or view loads with the embedded component, and the embedded component functions as expected.
+
+## Persist prerendered state
+
+Without persisting prerendered state, state used during prerendering is lost and must be recreated when the app is fully loaded. If any state is setup asynchronously, the UI may flicker as the prerendered UI is replaced with temporary placeholders and then fully rendered again.
+
+To persist state for prerendered components, use the [Persist Component State Tag Helper](xref:mvc/views/tag-helpers/builtin-th/persist-component-state-tag-helper) ([reference source](https://github.com/dotnet/aspnetcore/blob/main/src/Mvc/Mvc.TagHelpers/src/PersistComponentStateTagHelper.cs)). Add the Tag Helper's tag, ` `, inside the closing `` tag of the `_Host` page in an app that prerenders components.
+
+[!INCLUDE[](~/includes/aspnetcore-repo-ref-source-links.md)]
+
+In `Pages/_Host.cshtml` of Blazor apps that are WebAssembly prerendered (`WebAssemblyPrerendered`) in a hosted Blazor WebAssembly app:
+
+```cshtml
+
+ ...
+
+
+
+```
+
+Decide what state to persist using the service. [`PersistentComponentState.RegisterOnPersisting`](xref:Microsoft.AspNetCore.Components.PersistentComponentState.RegisterOnPersisting%2A) registers a callback to persist the component state before the app is paused. The state is retrieved when the application resumes.
+
+In the following example:
+
+* The `{TYPE}` placeholder represents the type of data to persist (for example, `WeatherForecast[]`).
+* The `{TOKEN}` placeholder is a state identifier string (for example, `fetchdata`).
+
+```razor
+@implements IDisposable
+@inject PersistentComponentState ApplicationState
+
+...
+
+@code {
+ private {TYPE} data;
+ private PersistingComponentStateSubscription persistingSubscription;
+
+ protected override async Task OnInitializedAsync()
+ {
+ persistingSubscription =
+ ApplicationState.RegisterOnPersisting(PersistData);
+
+ if (!ApplicationState.TryTakeFromJson<{TYPE}>(
+ "{TOKEN}", out var restored))
+ {
+ data = await ...;
+ }
+ else
+ {
+ data = restored!;
+ }
+ }
+
+ private Task PersistData()
+ {
+ ApplicationState.PersistAsJson("{TOKEN}", data);
+
+ return Task.CompletedTask;
+ }
+
+ void IDisposable.Dispose()
+ {
+ persistingSubscription.Dispose();
+ }
+}
+```
+
+The following example is an updated version of the `FetchData` component in a hosted Blazor WebAssembly app based on the Blazor project template. The `WeatherForecastPreserveState` component persists weather forecast state during prerendering and then retrieves the state to initialize the component. The [Persist Component State Tag Helper](xref:mvc/views/tag-helpers/builtin-th/persist-component-state-tag-helper) persists the component state after all component invocations.
+
+`Pages/WeatherForecastPreserveState.razor`:
+
+```razor
+@page "/weather-forecast-preserve-state"
+@using BlazorSample.Shared
+@implements IDisposable
+@inject IWeatherForecastService WeatherForecastService
+@inject PersistentComponentState ApplicationState
+
+Weather Forecast
+
+Weather forecast
+
+This component demonstrates fetching data from the server.
+
+@if (forecasts == null)
+{
+ Loading...
+}
+else
+{
+
+
+
+ Date
+ Temp. (C)
+ Temp. (F)
+ Summary
+
+
+
+ @foreach (var forecast in forecasts)
+ {
+
+ @forecast.Date.ToShortDateString()
+ @forecast.TemperatureC
+ @forecast.TemperatureF
+ @forecast.Summary
+
+ }
+
+
+}
+
+@code {
+ private WeatherForecast[] forecasts = Array.Empty();
+ private PersistingComponentStateSubscription persistingSubscription;
+
+ protected override async Task OnInitializedAsync()
+ {
+ persistingSubscription =
+ ApplicationState.RegisterOnPersisting(PersistForecasts);
+
+ if (!ApplicationState.TryTakeFromJson(
+ "fetchdata", out var restored))
+ {
+ forecasts =
+ await WeatherForecastService.GetForecastAsync(DateOnly.FromDateTime(DateTime.Now));
+ }
+ else
+ {
+ forecasts = restored!;
+ }
+ }
+
+ private Task PersistForecasts()
+ {
+ ApplicationState.PersistAsJson("fetchdata", forecasts);
+
+ return Task.CompletedTask;
+ }
+
+ void IDisposable.Dispose()
+ {
+ persistingSubscription.Dispose();
+ }
+}
+```
+
+By initializing components with the same state used during prerendering, any expensive initialization steps are only executed once. The rendered UI also matches the prerendered UI, so no flicker occurs in the browser.
+
+The persisted prerendered state is transferred to the client, where it's used to restore the component state. For prerendering in a hosted Blazor WebAssembly app, the data is exposed to the browser and must not contain sensitive, private information.
+
+## Additional Blazor WebAssembly resources
+
+* [State management: Handle prerendering](xref:blazor/state-management#handle-prerendering)
+* [Prerendering support with assembly lazy loading](xref:blazor/webassembly-lazy-load-assemblies#lazy-load-assemblies-in-a-hosted-blazor-webassembly-solution)
+* Razor component lifecycle subjects that pertain to prerendering
+ * [Component initialization (`OnInitialized{Async}`)](xref:blazor/components/lifecycle#component-initialization-oninitializedasync)
+ * [After component render (`OnAfterRender{Async}`)](xref:blazor/components/lifecycle#after-component-render-onafterrenderasync)
+ * [Stateful reconnection after prerendering](xref:blazor/components/lifecycle#stateful-reconnection-after-prerendering): Although the content in the section focuses on Blazor Server and stateful SignalR *reconnection*, the scenario for prerendering in hosted Blazor WebAssembly apps () involves similar conditions and approaches to prevent executing developer code twice. To preserve state during the execution of initialization code while prerendering, see *Persist prerendered state* section of this article.
+ * [Prerendering with JavaScript interop](xref:blazor/components/lifecycle#prerendering-with-javascript-interop)
+* Authentication and authorization subjects that pertain to prerendering
+ * [General aspects](xref:blazor/security/index)
+ * [Prerendering with authentication in hosted Blazor WebAssembly apps](xref:blazor/security/webassembly/additional-scenarios#prerendering-with-authentication)
+* [Host and deploy: Blazor WebAssembly](xref:blazor/host-and-deploy/webassembly)
+* [Handle errors: Prerendering](xref:blazor/fundamentals/handle-errors#prerendering)
+* is executed *twice* when prerendering: [Handle asynchronous navigation events with `OnNavigateAsync`](xref:blazor/fundamentals/routing#handle-asynchronous-navigation-events-with-onnavigateasync)
+
+:::moniker-end
+
+:::moniker range=">= aspnetcore-6.0 < aspnetcore-7.0"
+
+Prerendering can improve [Search Engine Optimization (SEO)](https://developer.mozilla.org/docs/Glossary/SEO) by rendering content for the initial HTTP response that search engines can use to calculate page rank.
+
+## Solution configuration
+
+### Prerendering configuration
+
+To set up prerendering for a hosted Blazor WebAssembly app:
+
+1. Host the Blazor WebAssembly app in an ASP.NET Core app. A standalone Blazor WebAssembly app can be added to an ASP.NET Core solution, or you can use a hosted Blazor WebAssembly app created from the [Blazor WebAssembly project template](xref:blazor/tooling) with the hosted option:
+
+ * Visual Studio: In the **Additional information** dialog, select the **ASP.NET Core Hosted** checkbox when creating the Blazor WebAssembly app. In this article's examples, the solution is named `BlazorHosted`.
+ * Visual Studio Code/.NET CLI command shell: `dotnet new blazorwasm -ho` (use the `-ho|--hosted` option). Use the `-o|--output {LOCATION}` option to create a folder for the solution and set the solution's project namespaces. In this article's examples, the solution is named `BlazorHosted` (`dotnet new blazorwasm -ho -o BlazorHosted`).
+
+ For the examples in this article, the client project's namespace is `BlazorHosted.Client`, and the server project's namespace is `BlazorHosted.Server`.
+
+1. **Delete** the `wwwroot/index.html` file from the Blazor WebAssembly **:::no-loc text="Client":::** project.
+
+1. In the **:::no-loc text="Client":::** project, **delete** the following lines in `Program.cs`:
+
+ ```diff
+ - builder.RootComponents.Add("#app");
+ - builder.RootComponents.Add("head::after");
+ ```
+
+1. Add `_Host.cshtml` and `_Layout.cshtml` files to the **:::no-loc text="Server":::** project's `Pages` folder. You can obtain the files from a project created from the Blazor Server template using Visual Studio or using the .NET CLI with the `dotnet new blazorserver -o BlazorServer` command in a command shell (the `-o BlazorServer` option creates a folder for the project). After placing the files into the **:::no-loc text="Server":::** project's `Pages` folder, make the following changes to the files.
+
+ > [!IMPORTANT]
+ > The use of a layout page (`_Layout.cshtml`) with a [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) for a component is required to control `` content, such as the page's title ( component) and other head elements ( component). For more information, see .
+
+ Make the following changes to the `_Layout.cshtml` file:
+
+ * Update the `Pages` namespace at the top of the file to match the namespace of the **:::no-loc text="Server":::** app's pages. The `{APP NAMESPACE}` placeholder in the following example represents the namespace of the donor app's pages that provided the `_Layout.cshtml` file:
+
+ Delete:
+
+ ```diff
+ - @namespace {APP NAMESPACE}.Pages
+ ```
+
+ Add:
+
+ ```razor
+ @namespace BlazorHosted.Server.Pages
+ ```
+
+ * Add an [`@using`](xref:mvc/views/razor#using) directive for the **:::no-loc text="Client":::** project at the top of the file:
+
+ ```razor
+ @using BlazorHosted.Client
+ ```
+
+ * Update the stylesheet links to point to the WebAssembly project's stylesheets. In the following example, the client project's namespace is `BlazorHosted.Client`. The `{APP NAMESPACE}` placeholder represents the namespace of the donor app that provided the `_Layout.cshtml` file. Update the Component Tag Helper (`` tag) for the `HeadOutlet` component to prerender the component.
+
+ Delete:
+
+ ```diff
+ -
+ -
+ -
+ ```
+
+ Add:
+
+ ```cshtml
+
+
+
+ ```
+
+ > [!NOTE]
+ > Leave the ` ` element that requests the Bootstrap stylesheet (`css/bootstrap/bootstrap.min.css`) in place.
+
+ * Update the Blazor script source to use the client-side Blazor WebAssembly script:
+
+ Delete:
+
+ ```diff
+ -
+ ```
+
+ Add:
+
+ ```html
+
+ ```
+
+ In the `_Host.cshtml` file:
+
+ * Change the `Pages` namespace to that of the **:::no-loc text="Client":::** project. The `{APP NAMESPACE}` placeholder represents the namespace of the donor app's pages that provided the `_Host.cshtml` file:
+
+ Delete:
+
+ ```diff
+ - @namespace {APP NAMESPACE}.Pages
+ ```
+
+ Add:
+
+ ```razor
+ @namespace BlazorHosted.Client
+ ```
+
+ * Update the `render-mode` of the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) to prerender the root `App` component with :
+
+ Delete:
+
+ ```diff
+ -
+ ```
+
+ Add:
+
+ ```cshtml
+
+ ```
+
+ > [!IMPORTANT]
+ > Prerendering isn't supported for authentication endpoints (`/authentication/` path segment). For more information, see .
+
+1. In endpoint mapping of the **:::no-loc text="Server":::** project in `Program.cs`, change the fallback from the `index.html` file to the `_Host.cshtml` page:
+
+ Delete:
+
+ ```diff
+ - app.MapFallbackToFile("index.html");
+ ```
+
+ Add:
+
+ ```csharp
+ app.MapFallbackToPage("/_Host");
+ ```
+
+1. If the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** projects use one or more common services during prerendering, factor the service registrations into a method that can be called from both projects. For more information, see .
+
+1. Run the **:::no-loc text="Server":::** project. The hosted Blazor WebAssembly app is prerendered by the **:::no-loc text="Server":::** project for clients.
+
+### Configuration for embedding Razor components into pages or views
+
+The following sections and examples for embedding Razor components from the **:::no-loc text="Client":::** Blazor WebAssembly app into pages or views of the server app require additional configuration.
+
+The **:::no-loc text="Server":::** project must have the following files and folders.
+
+Razor Pages:
+
+* `Pages/Shared/_Layout.cshtml`
+* `Pages/Shared/_Layout.cshtml.css`
+* `Pages/_ViewImports.cshtml`
+* `Pages/_ViewStart.cshtml`
+
+MVC:
+
+* `Views/Shared/_Layout.cshtml`
+* `Views/Shared/_Layout.cshtml.css`
+* `Views/_ViewImports.cshtml`
+* `Views/_ViewStart.cshtml`
+
+> [!IMPORTANT]
+> The use of a layout page (`_Layout.cshtml`) with a [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) for a component is required to control `` content, such as the page's title ( component) and other head elements ( component). For more information, see .
+
+The preceding files can be obtained by generating an app from the ASP.NET Core project templates using:
+
+* Visual Studio's new project creation tools.
+* Opening a command shell and executing `dotnet new webapp -o {PROJECT NAME}` (Razor Pages) or `dotnet new mvc -o {PROJECT NAME}` (MVC). The option `-o|--output` with a value for the `{PROJECT NAME}` placeholder provides a name for the app and creates a folder for the app.
+
+Update the namespaces in the imported `_ViewImports.cshtml` file to match those in use by the **:::no-loc text="Server":::** project receiving the files.
+
+`Pages/_ViewImports.cshtml` (Razor Pages):
+
+```razor
+@using BlazorHosted.Server
+@namespace BlazorHosted.Server.Pages
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+```
+
+`Views/_ViewImports.cshtml` (MVC):
+
+```razor
+@using BlazorHosted.Server
+@using BlazorHosted.Server.Models
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+```
+
+Update the imported layout file, which is `Pages/Shared/_Layout.cshtml` for Razor Pages or `Views/Shared/_Layout.cshtml` for MVC.
+
+First, delete the title and the stylesheet from the donor project, which is `RPDonor.styles.css` in the following example. The `{PROJECT NAME}` placeholder represents the donor project's app name.
+
+```diff
+- @ViewData["Title"] - {PROJECT NAME}
+-
+```
+
+Include the **:::no-loc text="Client":::** project's styles in the layout file. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`. The `` element can be updated at the same time.
+
+Place the following lines in the `` content of the layout file:
+
+```cshtml
+@ViewData["Title"] - BlazorHosted
+
+
+
+```
+
+The imported layout contains two `Home` (`Index` page) and `Privacy` navigation links. To make the `Home` links point to the hosted Blazor WebAssembly app, change the hyperlinks:
+
+```diff
+- {PROJECT NAME}
++ BlazorHosted
+```
+
+```diff
+- Home
++ Home
+```
+
+In an MVC layout file:
+
+```diff
+- {PROJECT NAME}
++ BlazorHosted
+```
+
+```diff
+- Home
++ Home
+```
+
+Update the `` element's app name. The following example uses the app name `BlazorHosted`:
+
+```diff
+- © {DATE} - {DONOR NAME} - Privacy
++ © {DATE} - BlazorHosted - Privacy
+```
+
+In the preceding example, the `{DATE}` placeholder represents the copyright date in an app generated from the Razor Pages or MVC project template.
+
+To make the `Privacy` link lead to a privacy page (Razor Pages), add a privacy page to the **:::no-loc text="Server":::** project.
+
+`Pages/Privacy.cshtml` in the **:::no-loc text="Server":::** project:
+
+```cshtml
+@page
+@model PrivacyModel
+@{
+ ViewData["Title"] = "Privacy Policy";
+}
+@ViewData["Title"]
+
+Use this page to detail your site's privacy policy.
+```
+
+For an MVC-based privacy view, create a privacy view in the **:::no-loc text="Server":::** project.
+
+`View/Home/Privacy.cshtml` in the **:::no-loc text="Server":::** project:
+
+```cshtml
+@{
+ ViewData["Title"] = "Privacy Policy";
+}
+@ViewData["Title"]
+
+Use this page to detail your site's privacy policy.
+```
+
+In the `Home` controller of the MVC app, return the view.
+
+Add the following code to `Controllers/HomeController.cs`:
+
+```csharp
+public IActionResult Privacy()
+{
+ return View();
+}
+```
+
+If you import files from a donor app, be sure to update any namespaces in the files to match that of the **:::no-loc text="Server":::** project (for example, `BlazorHosted.Server`).
+
+Import static assets to the **:::no-loc text="Server":::** project from the donor project's `wwwroot` folder:
+
+* `wwwroot/css` folder and contents
+* `wwwroot/js` folder and contents
+* `wwwroot/lib` folder and contents
+
+If the donor project is created from an ASP.NET Core project template and the files aren't modified, you can copy the entire `wwwroot` folder from the donor project into the **:::no-loc text="Server":::** project and remove the :::no-loc text="favicon"::: icon file.
+
+> [!WARNING]
+> Avoid placing the static asset into both the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** `wwwroot` folders. If the same file is present in both folders, an exception is thrown because the static asset in each folder shares the same web root path. Therefore, host a static asset in either `wwwroot` folder, not both.
+
+After adopting the preceding configuration, embed Razor components into pages or views of the **:::no-loc text="Server":::** project. Use the guidance in the following sections of this article:
+
+* *Render components in a page or view with the Component Tag Helper*
+* *Render components in a page or view with a CSS selector*
+
+## Render components in a page or view with the Component Tag Helper
+
+After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-or-views), the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) supports two render modes for rendering a component from a Blazor WebAssembly app in a page or view:
+
+*
+*
+
+In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections). To avoid using the full namespace for the `Counter` component with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) (`{ASSEMBLY NAME}.Pages.Counter`), add an [`@using`](xref:mvc/views/razor#using) directive for the client project's `Pages` namespace. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
+
+In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter1.cshtml`:
+
+```cshtml
+@page
+@using BlazorHosted.Client.Pages
+
+
+
+@section Scripts {
+
+}
+```
+
+Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter1`. The prerendered `Counter` component is embedded in the page.
+
+ configures whether the component:
+
+* Is prerendered into the page.
+* Is rendered as static HTML on the page or if it includes the necessary information to bootstrap a Blazor app from the user agent.
+
+For more information on the Component Tag Helper, including passing parameters and configuration, see .
+
+Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
+
+### Set child content through a render fragment
+
+The [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) doesn't support receiving a [`RenderFragment` delegate for child content](xref:blazor/components/index#child-content-render-fragments) (for example, `param-ChildContent="..."`). We recommend creating a Razor component (`.razor`) that references the component you want to render with the child content you want to pass and then invoke the Razor component from the page or view.
+
+### Ensure that top-level prerendered components aren't trimmed out on publish
+
+If a [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) directly references a component from a library that's subject to trimming on publish, the component might be trimmed out during publish because there are no references to it from client-side app code. As a result, the component isn't prerendered, leaving a blank spot in the output. If this occurs, instruct the trimmer to preserve the library component by adding a [`DynamicDependency` attribute](xref:System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute) to any class in the client-side app. To preserve a component called `SomeLibraryComponentToBePreserved`, add the following to any component:
+
+```razor
+@using System.Diagnostics.CodeAnalysis
+@attribute [DynamicDependency(DynamicallyAccessedMemberTypes.All,
+ typeof(SomeLibraryComponentToBePreserved))]
+```
+
+The preceding approach usually isn't required because the app usually prerenders its components (which are not trimmed), which in turn references components from libraries (causing them also not to be trimmed). Only use `DynamicDependency` explicitly for prerendering a library component directly when the library is subject to trimming.
+
+## Render components in a page or view with a CSS selector
+
+After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-or-views), add root components to the **:::no-loc text="Client":::** project of a hosted Blazor WebAssembly solution in the `Program.cs` file. In the following example, the `Counter` component is declared as a root component with a CSS selector that selects the element with the `id` that matches `counter-component`. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
+
+In `Program.cs` file of the **:::no-loc text="Client":::** project, add the namespace for the project's Razor components to the top of the file:
+
+```csharp
+using BlazorHosted.Client.Pages;
+```
+
+After the `builder` is established in `Program.cs`, add the `Counter` component as a root component:
+
+```csharp
+builder.RootComponents.Add("#counter-component");
+```
+
+In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections).
+
+In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter2.cshtml`:
+
+```cshtml
+@page
+
+Loading...
+
+@section Scripts {
+
+}
+```
+
+Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter2`. The prerendered `Counter` component is embedded in the page.
+
+Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
+
+> [!NOTE]
+> The preceding example throws a if a Blazor WebAssembly app is prerendered and integrated into a Razor Pages or MVC app **simultaneously** with the use of a CSS selector. Navigating to one of the **:::no-loc text="Client":::** project's Razor components or navigating to a page or view of the **:::no-loc text="Server":::** with an embedded component throws one or more .
+>
+> This is normal behavior because prerendering and integrating a Blazor WebAssembly app with routable Razor components is incompatible with the use of CSS selectors.
+>
+> If you've been working with the examples in the preceding sections and just wish to see the CSS selector work in your sample app, comment out the specification of the `App` root component of the **:::no-loc text="Client":::** project's `Program.cs` file:
+>
+> ```diff
+> - builder.RootComponents.Add("#app");
+> + //builder.RootComponents.Add("#app");
+> ```
+>
+> Navigate to the page or view with the embedded Razor component that uses a CSS selector (for example, `/razorpagescounter2` of the preceding example). The page or view loads with the embedded component, and the embedded component functions as expected.
+
+## Persist prerendered state
+
+Without persisting prerendered state, state used during prerendering is lost and must be recreated when the app is fully loaded. If any state is setup asynchronously, the UI may flicker as the prerendered UI is replaced with temporary placeholders and then fully rendered again.
+
+To solve these problems, Blazor supports persisting state in a prerendered page using the [Persist Component State Tag Helper](xref:mvc/views/tag-helpers/builtin-th/persist-component-state-tag-helper). Add the Tag Helper's tag, ` `, inside the closing `` tag.
+
+`Pages/_Layout.cshtml`:
+
+```cshtml
+
+ ...
+
+
+
+```
+
+Decide what state to persist using the service. [`PersistentComponentState.RegisterOnPersisting`](xref:Microsoft.AspNetCore.Components.PersistentComponentState.RegisterOnPersisting%2A) registers a callback to persist the component state before the app is paused. The state is retrieved when the application resumes.
+
+The following example is an updated version of the `FetchData` component in a hosted Blazor WebAssembly app based on the Blazor project template. The `WeatherForecastPreserveState` component persists weather forecast state during prerendering and then retrieves the state to initialize the component. The [Persist Component State Tag Helper](xref:mvc/views/tag-helpers/builtin-th/persist-component-state-tag-helper) persists the component state after all component invocations.
+
+`Pages/WeatherForecastPreserveState.razor`:
+
+```razor
+@page "/weather-forecast-preserve-state"
+@implements IDisposable
+@using BlazorSample.Shared
+@inject IWeatherForecastService WeatherForecastService
+@inject PersistentComponentState ApplicationState
+
+Weather Forecast
+
+Weather forecast
+
+This component demonstrates fetching data from the server.
+
+@if (forecasts == null)
+{
+ Loading...
+}
+else
+{
+
+
+
+ Date
+ Temp. (C)
+ Temp. (F)
+ Summary
+
+
+
+ @foreach (var forecast in forecasts)
+ {
+
+ @forecast.Date.ToShortDateString()
+ @forecast.TemperatureC
+ @forecast.TemperatureF
+ @forecast.Summary
+
+ }
+
+
+}
+
+@code {
+ private WeatherForecast[] forecasts = Array.Empty();
+ private PersistingComponentStateSubscription persistingSubscription;
+
+ protected override async Task OnInitializedAsync()
+ {
+ persistingSubscription =
+ ApplicationState.RegisterOnPersisting(PersistForecasts);
+
+ if (!ApplicationState.TryTakeFromJson(
+ "fetchdata", out var restored))
+ {
+ forecasts =
+ await WeatherForecastService.GetForecastAsync(DateTime.Now);
+ }
+ else
+ {
+ forecasts = restored!;
+ }
+ }
+
+ private Task PersistForecasts()
+ {
+ ApplicationState.PersistAsJson("fetchdata", forecasts);
+
+ return Task.CompletedTask;
+ }
+
+ void IDisposable.Dispose()
+ {
+ persistingSubscription.Dispose();
+ }
+}
+```
+
+By initializing components with the same state used during prerendering, any expensive initialization steps are only executed once. The rendered UI also matches the prerendered UI, so no flicker occurs in the browser.
+
+The persisted prerendered state is transferred to the client, where it's used to restore the component state. For prerendering in a hosted Blazor WebAssembly app, the data is exposed to the browser and must not contain sensitive, private information.
+
+## Additional Blazor WebAssembly resources
+
+* [State management: Handle prerendering](xref:blazor/state-management#handle-prerendering)
+* [Prerendering support with assembly lazy loading](xref:blazor/webassembly-lazy-load-assemblies#lazy-load-assemblies-in-a-hosted-blazor-webassembly-solution)
+* Razor component lifecycle subjects that pertain to prerendering
+ * [Component initialization (`OnInitialized{Async}`)](xref:blazor/components/lifecycle#component-initialization-oninitializedasync)
+ * [After component render (`OnAfterRender{Async}`)](xref:blazor/components/lifecycle#after-component-render-onafterrenderasync)
+ * [Stateful reconnection after prerendering](xref:blazor/components/lifecycle#stateful-reconnection-after-prerendering): Although the content in the section focuses on Blazor Server and stateful SignalR *reconnection*, the scenario for prerendering in hosted Blazor WebAssembly apps () involves similar conditions and approaches to prevent executing developer code twice. To preserve state during the execution of initialization code while prerendering, see *Persist prerendered state* section of this article.
+ * [Prerendering with JavaScript interop](xref:blazor/components/lifecycle#prerendering-with-javascript-interop)
+* Authentication and authorization subjects that pertain to prerendering
+ * [General aspects](xref:blazor/security/index#aspnet-core-blazor-authentication-and-authorization)
+ * [Prerendering with authentication](xref:blazor/security/webassembly/additional-scenarios#prerendering-with-authentication)
+* [Host and deploy: Blazor WebAssembly](xref:blazor/host-and-deploy/webassembly)
+
+:::moniker-end
+
+:::moniker range=">= aspnetcore-5.0 < aspnetcore-6.0"
+
+Prerendering can improve [Search Engine Optimization (SEO)](https://developer.mozilla.org/docs/Glossary/SEO) by rendering content for the initial HTTP response that search engines can use to calculate page rank.
+
+## Solution configuration
+
+### Prerendering configuration
+
+To set up prerendering for a hosted Blazor WebAssembly app:
+
+1. Host the Blazor WebAssembly app in an ASP.NET Core app. A standalone Blazor WebAssembly app can be added to an ASP.NET Core solution, or you can use a hosted Blazor WebAssembly app created from the [Blazor WebAssembly project template](xref:blazor/tooling) with the hosted option:
+
+ * Visual Studio: In the **Additional information** dialog, select the **ASP.NET Core Hosted** checkbox when creating the Blazor WebAssembly app. In this article's examples, the solution is named `BlazorHosted`.
+ * Visual Studio Code/.NET CLI command shell: `dotnet new blazorwasm -ho` (use the `-ho|--hosted` option). Use the `-o|--output {LOCATION}` option to create a folder for the solution and set the solution's project namespaces. In this article's examples, the solution is named `BlazorHosted` (`dotnet new blazorwasm -ho -o BlazorHosted`).
+
+ For the examples in this article, the client project's namespace is `BlazorHosted.Client`, and the server project's namespace is `BlazorHosted.Server`.
+
+1. **Delete** the `wwwroot/index.html` file from the Blazor WebAssembly **:::no-loc text="Client":::** project.
+
+1. In the **:::no-loc text="Client":::** project, **delete** the following line in `Program.cs`:
+
+ ```diff
+ - builder.RootComponents.Add("#app");
+ ```
+
+1. Add a `Pages/_Host.cshtml` file to the **:::no-loc text="Server":::** project's `Pages` folder. You can obtain a `_Host.cshtml` file from a project created from the Blazor Server template with the `dotnet new blazorserver -o BlazorServer` command in a command shell (the `-o BlazorServer` option creates a folder for the project). After placing the `Pages/_Host.cshtml` file into the **:::no-loc text="Server":::** project of the hosted Blazor WebAssembly solution, make the following changes to the file:
+
+ * Provide an [`@using`](xref:mvc/views/razor#using) directive for the **:::no-loc text="Client":::** project (for example, `@using BlazorHosted.Client`).
+ * Update the stylesheet links to point to the WebAssembly project's stylesheets. In the following example, the client project's namespace is `BlazorHosted.Client`:
+
+ ```diff
+ -
+ -
+ +
+ +
+ ```
+
+ > [!NOTE]
+ > Leave the ` ` element that requests the Bootstrap stylesheet (`css/bootstrap/bootstrap.min.css`) in place.
+
+ * Update the `render-mode` of the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) to prerender the root `App` component with :
+
+ ```diff
+ -
+ +
+ ```
+
+ * Update the Blazor script source to use the client-side Blazor WebAssembly script:
+
+ ```diff
+ -
+ +
+ ```
+
+1. In `Startup.Configure` of the **:::no-loc text="Server":::** project, change the fallback from the `index.html` file to the `_Host.cshtml` page.
+
+ `Startup.cs`:
+
+ ```diff
+ - endpoints.MapFallbackToFile("index.html");
+ + endpoints.MapFallbackToPage("/_Host");
+ ```
+
+1. If the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** projects use one or more common services during prerendering, factor the service registrations into a method that can be called from both projects. For more information, see .
+
+1. Run the **:::no-loc text="Server":::** project. The hosted Blazor WebAssembly app is prerendered by the **:::no-loc text="Server":::** project for clients.
+
+### Configuration for embedding Razor components into pages or views
+
+The following sections and examples in this article for embedding Razor components of the client Blazor WebAssembly app into pages or views of the server app require additional configuration.
+
+Use a default Razor Pages or MVC layout file in the **:::no-loc text="Server":::** project. The **:::no-loc text="Server":::** project must have the following files and folders.
+
+Razor Pages:
+
+* `Pages/Shared/_Layout.cshtml`
+* `Pages/_ViewImports.cshtml`
+* `Pages/_ViewStart.cshtml`
+
+MVC:
+
+* `Views/Shared/_Layout.cshtml`
+* `Views/_ViewImports.cshtml`
+* `Views/_ViewStart.cshtml`
+
+Obtain the preceding files from an app created from the Razor Pages or MVC project template. For more information, see or .
+
+Update the namespaces in the imported `_ViewImports.cshtml` file to match those in use by the **:::no-loc text="Server":::** project receiving the files.
+
+Update the imported layout file (`_Layout.cshtml`) to include the **:::no-loc text="Client":::** project's styles. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`. The `` element can be updated at the same time.
+
+`Pages/Shared/_Layout.cshtml` (Razor Pages) or `Views/Shared/_Layout.cshtml` (MVC):
+
+```diff
+
+
+
+- @ViewData["Title"] - DonorProject
++ @ViewData["Title"] - BlazorHosted
+
+
++
++
+
+```
+
+The imported layout contains `Home` and `Privacy` navigation links. To make the `Home` link point to the hosted Blazor WebAssembly app, change the hyperlink:
+
+```diff
+- Home
++ Home
+```
+
+In an MVC layout file:
+
+```diff
+- Home
++ Home
+```
+
+To make the `Privacy` link lead to a privacy page, add a privacy page to the **:::no-loc text="Server":::** project.
+
+`Pages/Privacy.cshtml` in the **:::no-loc text="Server":::** project:
+
+```cshtml
+@page
+@model BlazorHosted.Server.Pages.PrivacyModel
+@{
+}
+
+Privacy Policy
+```
+
+If an MVC-based privacy view is preferred, create a privacy view in the **:::no-loc text="Server":::** project.
+
+`View/Home/Privacy.cshtml`:
+
+```cshtml
+@{
+ ViewData["Title"] = "Privacy Policy";
+}
+
+@ViewData["Title"]
+```
+
+In the `Home` controller, return the view.
+
+`Controllers/HomeController.cs`:
+
+```csharp
+public IActionResult Privacy()
+{
+ return View();
+}
+```
+
+Import static assets to the **:::no-loc text="Server":::** project from the donor project's `wwwroot` folder:
+
+* `wwwroot/css` folder and contents
+* `wwwroot/js` folder and contents
+* `wwwroot/lib` folder and contents
+
+If the donor project is created from an ASP.NET Core project template and the files aren't modified, you can copy the entire `wwwroot` folder from the donor project into the **:::no-loc text="Server":::** project and remove the :::no-loc text="favicon"::: icon file.
+
+> [!WARNING]
+> Avoid placing the static asset into both the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** `wwwroot` folders. If the same file is present in both folders, an exception is thrown because the static asset in each folder shares the same web root path. Therefore, host a static asset in either `wwwroot` folder, not both.
+
+## Render components in a page or view with the Component Tag Helper
+
+After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-or-views), the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) supports two render modes for rendering a component from a Blazor WebAssembly app in a page or view:
+
+*
+*
+
+In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections). To avoid using the full namespace for the `Counter` component with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) (`{ASSEMBLY NAME}.Pages.Counter`), add an [`@using`](xref:mvc/views/razor#using) directive for the client project's `Pages` namespace. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
+
+In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter1.cshtml`:
+
+```cshtml
+@page
+@using BlazorHosted.Client.Pages
+
+
+
+@section Scripts {
+
+}
+```
+
+Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter1`. The prerendered `Counter` component is embedded in the page.
+
+ configures whether the component:
+
+* Is prerendered into the page.
+* Is rendered as static HTML on the page or if it includes the necessary information to bootstrap a Blazor app from the user agent.
+
+For more information on the Component Tag Helper, including passing parameters and configuration, see .
+
+Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
+
+## Render components in a page or view with a CSS selector
+
+After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-or-views), add root components to the **:::no-loc text="Client":::** project of a hosted Blazor WebAssembly solution in `Program.cs`. In the following example, the `Counter` component is declared as a root component with a CSS selector that selects the element with the `id` that matches `counter-component`. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
+
+In `Program.cs` of the **:::no-loc text="Client":::** project, add the namespace for the project's Razor components to the top of the file:
+
+```csharp
+using BlazorHosted.Client.Pages;
+```
+
+After the `builder` is established in `Program.cs`, add the `Counter` component as a root component:
+
+```csharp
+builder.RootComponents.Add("#counter-component");
+```
+
+In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections).
+
+In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter2.cshtml`:
+
+```cshtml
+@page
+
+Loading...
+
+@section Scripts {
+
+}
+```
+
+Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter2`. The prerendered `Counter` component is embedded in the page.
+
+Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
+
+> [!NOTE]
+> The preceding example throws a if a Blazor WebAssembly app is prerendered and integrated into a Razor Pages or MVC app **simultaneously** with a CSS selector. Navigating to one of the **:::no-loc text="Client":::** project's Razor components throws the following exception:
+>
+> > Microsoft.JSInterop.JSException: Could not find any element matching selector '#counter-component'.
+>
+> This is normal behavior because prerendering and integrating a Blazor WebAssembly app with routable Razor components is incompatible with the use of CSS selectors.
+
+## Additional Blazor WebAssembly resources
+
+* [State management: Handle prerendering](xref:blazor/state-management#handle-prerendering)
+* [Prerendering support with assembly lazy loading](xref:blazor/webassembly-lazy-load-assemblies#lazy-load-assemblies-in-a-hosted-blazor-webassembly-solution)
+* Razor component lifecycle subjects that pertain to prerendering
+ * [Component initialization (`OnInitialized{Async}`)](xref:blazor/components/lifecycle#component-initialization-oninitializedasync)
+ * [After component render (`OnAfterRender{Async}`)](xref:blazor/components/lifecycle#after-component-render-onafterrenderasync)
+ * [Stateful reconnection after prerendering](xref:blazor/components/lifecycle#stateful-reconnection-after-prerendering): Although the content in the section focuses on Blazor Server and stateful SignalR *reconnection*, the scenario for prerendering in hosted Blazor WebAssembly apps () involves similar conditions and approaches to prevent executing developer code twice. To preserve state during the execution of initialization code while prerendering, see *Persist prerendered state* section of this article.
+ * [Prerendering with JavaScript interop](xref:blazor/components/lifecycle#prerendering-with-javascript-interop)
+* Authentication and authorization subjects that pertain to prerendering
+ * [General aspects](xref:blazor/security/index#aspnet-core-blazor-authentication-and-authorization)
+ * [Prerendering with authentication](xref:blazor/security/webassembly/additional-scenarios#prerendering-with-authentication)
+* [Host and deploy: Blazor WebAssembly](xref:blazor/host-and-deploy/webassembly)
+
+:::moniker-end
+
+:::moniker range="< aspnetcore-5.0"
+
+Integrating Razor components into Razor Pages or MVC apps in a hosted Blazor WebAssembly [solution](xref:blazor/tooling#visual-studio-solution-file-sln) is supported in ASP.NET Core in .NET 5 or later. Select a .NET 5 or later version of this article.
+
+:::moniker-end
diff --git a/aspnetcore/blazor/components/integration.md b/aspnetcore/blazor/components/integration.md
index 824313ef36de..08222773c383 100644
--- a/aspnetcore/blazor/components/integration.md
+++ b/aspnetcore/blazor/components/integration.md
@@ -1,405 +1,24 @@
---
-title: Integrate ASP.NET Core Razor components
+title: Integrate ASP.NET Core Razor components with MVC or Razor Pages
author: guardrex
-description: Learn about Razor component integration scenarios for Blazor apps, including prerendering of Razor components on the server.
+description: Learn about Razor component integration scenarios for MVC or Razor Pages, including prerendering of Razor components on the server.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/integration
-zone_pivot_groups: blazor-hosting-models
---
-# Prerender and integrate ASP.NET Core Razor components
+# Integrate ASP.NET Core Razor components with MVC or Razor Pages
[!INCLUDE[](~/includes/not-latest-version.md)]
-This article explains Razor component integration scenarios for Blazor apps, including prerendering of Razor components on the server.
+Razor components can be integrated into Razor Pages or MVC apps. When the page or view is rendered, components can be prerendered at the same time.
> [!IMPORTANT]
> Framework changes across ASP.NET Core releases led to different sets of instructions in this article. Before using this article's guidance, confirm that the document version selector at the top of this article matches the version of ASP.NET Core that you intend to use for your app.
:::moniker range=">= aspnetcore-7.0"
-:::zone pivot="webassembly"
-
-Razor components can be integrated into Razor Pages and MVC apps in a hosted Blazor WebAssembly [solution](xref:blazor/tooling#visual-studio-solution-file-sln). When the page or view is rendered, components can be prerendered at the same time.
-
-Prerendering can improve [Search Engine Optimization (SEO)](https://developer.mozilla.org/docs/Glossary/SEO) by rendering content for the initial HTTP response that search engines can use to calculate page rank.
-
-## Solution configuration
-
-### Prerendering configuration
-
-To set up prerendering for a hosted Blazor WebAssembly app:
-
-1. Host the Blazor WebAssembly app in an ASP.NET Core app. A standalone Blazor WebAssembly app can be added to an ASP.NET Core solution, or you can use a hosted Blazor WebAssembly app created from the [Blazor WebAssembly project template](xref:blazor/tooling) with the hosted option:
-
- * Visual Studio: In the **Additional information** dialog, select the **ASP.NET Core Hosted** checkbox when creating the Blazor WebAssembly app. In this article's examples, the solution is named `BlazorHosted`.
- * Visual Studio Code/.NET CLI command shell: `dotnet new blazorwasm -ho` (use the `-ho|--hosted` option). Use the `-o|--output {LOCATION}` option to create a folder for the solution and set the solution's project namespaces. In this article's examples, the solution is named `BlazorHosted` (`dotnet new blazorwasm -ho -o BlazorHosted`).
-
- For the examples in this article, the hosted solution's name (assembly name) is `BlazorHosted`. The client project's namespace is `BlazorHosted.Client`, and the server project's namespace is `BlazorHosted.Server`.
-
-1. **Delete** the `wwwroot/index.html` file from the Blazor WebAssembly **:::no-loc text="Client":::** project.
-
-1. In the **:::no-loc text="Client":::** project, **delete** the following lines in `Program.cs`:
-
- ```diff
- - builder.RootComponents.Add("#app");
- - builder.RootComponents.Add("head::after");
- ```
-
-1. Add `_Host.cshtml` file to the **:::no-loc text="Server":::** project's `Pages` folder. You can obtain the files from a project created from the Blazor Server template using Visual Studio or using the .NET CLI with the `dotnet new blazorserver -o BlazorServer` command in a command shell (the `-o BlazorServer` option creates a folder for the project). After placing the files into the **:::no-loc text="Server":::** project's `Pages` folder, make the following changes to the files.
-
- Make the following changes to the `_Host.cshtml` file:
-
- * Update the `Pages` namespace at the top of the file to match the namespace of the **:::no-loc text="Server":::** app's pages. The `{APP NAMESPACE}` placeholder in the following example represents the namespace of the donor app's pages that provided the `_Host.cshtml` file:
-
- Delete:
-
- ```diff
- - @namespace {APP NAMESPACE}.Pages
- ```
-
- Add:
-
- ```razor
- @namespace BlazorHosted.Server.Pages
- ```
-
- * Add an [`@using`](xref:mvc/views/razor#using) directive for the **:::no-loc text="Client":::** project at the top of the file:
-
- ```razor
- @using BlazorHosted.Client
- ```
-
- * Update the stylesheet links to point to the WebAssembly project's stylesheets. In the following example, the client project's namespace is `BlazorHosted.Client`. The `{APP NAMESPACE}` placeholder represents the namespace of the donor app that provided the `_Host.cshtml` file. Update the Component Tag Helper (`` tag) for the `HeadOutlet` component to prerender the component.
-
- Delete:
-
- ```diff
- -
- -
- -
- ```
-
- Add:
-
- ```cshtml
-
-
-
- ```
-
- > [!NOTE]
- > Leave the ` ` element that requests the Bootstrap stylesheet (`css/bootstrap/bootstrap.min.css`) in place.
-
- * Update the Blazor script source to use the client-side Blazor WebAssembly script:
-
- Delete:
-
- ```diff
- -
- ```
-
- Add:
-
- ```html
-
- ```
-
- * Update the `render-mode` of the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) to prerender the root `App` component with :
-
- Delete:
-
- ```diff
- -
- ```
-
- Add:
-
- ```cshtml
-
- ```
-
- > [!IMPORTANT]
- > Prerendering isn't supported for authentication endpoints (`/authentication/` path segment). For more information, see .
-
-1. In the `Program.cs` file of the **:::no-loc text="Server":::** project, change the fallback endpoint from the `index.html` file to the `_Host.cshtml` page:
-
- Delete:
-
- ```diff
- - app.MapFallbackToFile("index.html");
- ```
-
- Add:
-
- ```csharp
- app.MapFallbackToPage("/_Host");
- ```
-
-1. If the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** projects use one or more common services during prerendering, factor the service registrations into a method that can be called from both projects. For more information, see .
-
-1. Run the **:::no-loc text="Server":::** project. The hosted Blazor WebAssembly app is prerendered by the **:::no-loc text="Server":::** project for clients.
-
-### Configuration for embedding Razor components into pages and views
-
-The following sections and examples for embedding Razor components from the **:::no-loc text="Client":::** Blazor WebAssembly app into pages and views of the server app require additional configuration.
-
-The **:::no-loc text="Server":::** project must have the following files and folders.
-
-Razor Pages:
-
-* `Pages/Shared/_Layout.cshtml`
-* `Pages/Shared/_Layout.cshtml.css`
-* `Pages/_ViewImports.cshtml`
-* `Pages/_ViewStart.cshtml`
-
-MVC:
-
-* `Views/Shared/_Layout.cshtml`
-* `Views/Shared/_Layout.cshtml.css`
-* `Views/_ViewImports.cshtml`
-* `Views/_ViewStart.cshtml`
-
-The preceding files can be obtained by generating an app from the ASP.NET Core project templates using:
-
-* Visual Studio's new project creation tools.
-* Opening a command shell and executing `dotnet new webapp -o {PROJECT NAME}` (Razor Pages) or `dotnet new mvc -o {PROJECT NAME}` (MVC). The option `-o|--output` with a value for the `{PROJECT NAME}` placeholder provides a name for the app and creates a folder for the app.
-
-Update the namespaces in the imported `_ViewImports.cshtml` file to match those in use by the **:::no-loc text="Server":::** project receiving the files.
-
-`Pages/_ViewImports.cshtml` (Razor Pages):
-
-```razor
-@using BlazorHosted.Server
-@namespace BlazorHosted.Server.Pages
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
-```
-
-`Views/_ViewImports.cshtml` (MVC):
-
-```razor
-@using BlazorHosted.Server
-@using BlazorHosted.Server.Models
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
-```
-
-Update the imported layout file, which is `Pages/Shared/_Layout.cshtml` for Razor Pages or `Views/Shared/_Layout.cshtml` for MVC.
-
-First, delete the title and the stylesheet from the donor project, which is `RPDonor.styles.css` in the following example. The `{PROJECT NAME}` placeholder represents the donor project's app name.
-
-```diff
-- @ViewData["Title"] - {PROJECT NAME}
--
-```
-
-Include the **:::no-loc text="Client":::** project's styles in the layout file. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`. The `` element can be updated at the same time.
-
-Place the following lines in the `` content of the layout file:
-
-```cshtml
-@ViewData["Title"] - BlazorHosted
-
-
-
-```
-
-The imported layout contains two `Home` (`Index` page) and `Privacy` navigation links. To make the `Home` links point to the hosted Blazor WebAssembly app, change the hyperlinks:
-
-```diff
-- {PROJECT NAME}
-+ BlazorHosted
-```
-
-```diff
-- Home
-+ Home
-```
-
-In an MVC layout file:
-
-```diff
-- {PROJECT NAME}
-+ BlazorHosted
-```
-
-```diff
-- Home
-+ Home
-```
-
-Update the `` element's app name. The following example uses the app name `BlazorHosted`:
-
-```diff
-- © {DATE} - {DONOR NAME} - Privacy
-+ © {DATE} - BlazorHosted - Privacy
-```
-
-In the preceding example, the `{DATE}` placeholder represents the copyright date in an app generated from the Razor Pages or MVC project template.
-
-To make the `Privacy` link lead to a privacy page (Razor Pages), add a privacy page to the **:::no-loc text="Server":::** project.
-
-`Pages/Privacy.cshtml` in the **:::no-loc text="Server":::** project:
-
-```cshtml
-@page
-@model PrivacyModel
-@{
- ViewData["Title"] = "Privacy Policy";
-}
-@ViewData["Title"]
-
-Use this page to detail your site's privacy policy.
-```
-
-For an MVC-based privacy view, create a privacy view in the **:::no-loc text="Server":::** project.
-
-`View/Home/Privacy.cshtml` in the **:::no-loc text="Server":::** project:
-
-```cshtml
-@{
- ViewData["Title"] = "Privacy Policy";
-}
-@ViewData["Title"]
-
-Use this page to detail your site's privacy policy.
-```
-
-In the `Home` controller of the MVC app, return the view.
-
-Add the following code to `Controllers/HomeController.cs`:
-
-```csharp
-public IActionResult Privacy()
-{
- return View();
-}
-```
-
-If you import files from a donor app, be sure to update any namespaces in the files to match that of the **:::no-loc text="Server":::** project (for example, `BlazorHosted.Server`).
-
-Import static assets to the **:::no-loc text="Server":::** project from the donor project's `wwwroot` folder:
-
-* `wwwroot/css` folder and contents
-* `wwwroot/js` folder and contents
-* `wwwroot/lib` folder and contents
-
-If the donor project is created from an ASP.NET Core project template and the files aren't modified, you can copy the entire `wwwroot` folder from the donor project into the **:::no-loc text="Server":::** project and remove the :::no-loc text="favicon"::: icon file.
-
-> [!WARNING]
-> Avoid placing the static asset into both the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** `wwwroot` folders. If the same file is present in both folders, an exception is thrown because the static assets share the same web root path. Therefore, host a static asset in either of the `wwwroot` folders, not both.
-
-After adopting the preceding configuration, embed Razor components into pages or views of the **:::no-loc text="Server":::** project. Use the guidance in the following sections of this article:
-
-* *Render components in a page or view with the Component Tag Helper*
-* *Render components in a page or view with a CSS selector*
-
-## Render components in a page or view with the Component Tag Helper
-
-After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-and-views), the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) supports two render modes for rendering a component from a Blazor WebAssembly app in a page or view:
-
-*
-*
-
-In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections). To avoid using the full namespace for the `Counter` component with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) (`{ASSEMBLY NAME}.Pages.Counter`), add an [`@using`](xref:mvc/views/razor#using) directive for the client project's `Pages` namespace. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
-
-In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter1.cshtml`:
-
-```cshtml
-@page
-@using BlazorHosted.Client.Pages
-
-
-
-@section Scripts {
-
-}
-```
-
-Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter1`. The prerendered `Counter` component is embedded in the page.
-
- configures whether the component:
-
-* Is prerendered into the page.
-* Is rendered as static HTML on the page or if it includes the necessary information to bootstrap a Blazor app from the user agent.
-
-For more information on the Component Tag Helper, including passing parameters and configuration, see .
-
-Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
-
-### Set child content through a render fragment
-
-The [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) doesn't support receiving a [`RenderFragment` delegate for child content](xref:blazor/components/index#child-content-render-fragments) (for example, `param-ChildContent="..."`). We recommend creating a Razor component (`.razor`) that references the component you want to render with the child content you want to pass and then invoke the Razor component from the page or view.
-
-### Ensure that top-level prerendered components aren't trimmed out on publish
-
-If a [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) directly references a component from a library that's subject to trimming on publish, the component might be trimmed out during publish because there are no references to it from client-side app code. As a result, the component isn't prerendered, leaving a blank spot in the output. If this occurs, instruct the trimmer to preserve the library component by adding a [`DynamicDependency` attribute](xref:System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute) to any class in the client-side app. To preserve a component called `SomeLibraryComponentToBePreserved`, add the following to any component:
-
-```razor
-@using System.Diagnostics.CodeAnalysis
-@attribute [DynamicDependency(DynamicallyAccessedMemberTypes.All,
- typeof(SomeLibraryComponentToBePreserved))]
-```
-
-The preceding approach usually isn't required because the app usually prerenders its components (which are not trimmed), which in turn references components from libraries (causing them also not to be trimmed). Only use `DynamicDependency` explicitly for prerendering a library component directly when the library is subject to trimming.
-
-## Render components in a page or view with a CSS selector
-
-After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-and-views), add root components to the **:::no-loc text="Client":::** project of a hosted Blazor WebAssembly solution in the `Program.cs` file. In the following example, the `Counter` component is declared as a root component with a CSS selector that selects the element with the `id` that matches `counter-component`. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
-
-In `Program.cs` file of the **:::no-loc text="Client":::** project, add the namespace for the project's Razor components to the top of the file:
-
-```csharp
-using BlazorHosted.Client.Pages;
-```
-
-After the `builder` is established in `Program.cs`, add the `Counter` component as a root component:
-
-```csharp
-builder.RootComponents.Add("#counter-component");
-```
-
-In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections).
-
-In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter2.cshtml`:
-
-```cshtml
-@page
-
-Loading...
-
-@section Scripts {
-
-}
-```
-
-Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter2`. The prerendered `Counter` component is embedded in the page.
-
-Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
-
-> [!NOTE]
-> The preceding example throws a if a Blazor WebAssembly app is prerendered and integrated into a Razor Pages or MVC app **simultaneously** with the use of a CSS selector. Navigating to one of the **:::no-loc text="Client":::** project's Razor components or navigating to a page or view of the **:::no-loc text="Server":::** with an embedded component throws one or more .
->
-> This is normal behavior because prerendering and integrating a Blazor WebAssembly app with routable Razor components is incompatible with the use of CSS selectors.
->
-> If you've been working with the examples in the preceding sections and just wish to see the CSS selector work in your sample app, comment out the specification of the `App` root component of the **:::no-loc text="Client":::** project's `Program.cs` file:
->
-> ```diff
-> - builder.RootComponents.Add("#app");
-> + //builder.RootComponents.Add("#app");
-> ```
->
-> Navigate to the page or view with the embedded Razor component that uses a CSS selector (for example, `/razorpagescounter2` of the preceding example). The page or view loads with the embedded component, and the embedded component functions as expected.
-
-:::zone-end
-
-:::zone pivot="server"
-
-Razor components can be integrated into Razor Pages and MVC apps. When the page or view is rendered, components can be prerendered at the same time.
-
Prerendering can improve [Search Engine Optimization (SEO)](https://developer.mozilla.org/docs/Glossary/SEO) by rendering content for the initial HTTP response that search engines can use to calculate page rank.
After [configuring the project](#configuration), use the guidance in the following sections depending on the project's requirements:
@@ -407,11 +26,11 @@ After [configuring the project](#configuration), use the guidance in the followi
* For components that are directly routable from user requests. Follow this guidance when visitors should be able to make an HTTP request in their browser for a component with an [`@page`](xref:mvc/views/razor#page) directive.
* [Use routable components in a Razor Pages app](#use-routable-components-in-a-razor-pages-app)
* [Use routable components in an MVC app](#use-routable-components-in-an-mvc-app)
-* For components that aren't directly routable from user requests, see the [Render components from a page or view](#render-components-from-a-page-or-view) section. Follow this guidance when the app embeds components into existing pages and views with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper).
+* For components that aren't directly routable from user requests, see the [Render components from a page or view](#render-components-from-a-page-or-view) section. Follow this guidance when the app embeds components into existing pages or views with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper).
## Configuration
-Use the following guidance to integrate Razor components into pages and views of an existing Razor Pages or MVC app.
+Use the following guidance to integrate Razor components into pages or views of an existing Razor Pages or MVC app.
1. Add an imports file to the root folder of the project with the following content. Change the `{APP NAMESPACE}` placeholder to the namespace of the project.
@@ -765,8 +384,6 @@ The `_ViewImports.cshtml` file is located in the `Pages` folder of a Razor Pages
For more information, see .
-:::zone-end
-
## Persist prerendered state
Without persisting prerendered state, state used during prerendering is lost and must be recreated when the app is fully loaded. If any state is setup asynchronously, the UI may flicker as the prerendered UI is replaced with temporary placeholders and then fully rendered again.
@@ -775,7 +392,7 @@ To persist state for prerendered components, use the [Persist Component State Ta
[!INCLUDE[](~/includes/aspnetcore-repo-ref-source-links.md)]
-In `Pages/_Host.cshtml` of Blazor apps that are either WebAssembly prerendered (`WebAssemblyPrerendered`) in a hosted Blazor WebAssembly app or `ServerPrerendered` in a Blazor Server app:
+In `Pages/_Host.cshtml` of Blazor apps that are `ServerPrerendered` in a Blazor Server app:
```cshtml
@@ -814,565 +431,139 @@ In the following example:
}
else
{
- data = restored!;
- }
- }
-
- private Task PersistData()
- {
- ApplicationState.PersistAsJson("{TOKEN}", data);
-
- return Task.CompletedTask;
- }
-
- void IDisposable.Dispose()
- {
- persistingSubscription.Dispose();
- }
-}
-```
-
-The following example is an updated version of the `FetchData` component in a hosted Blazor WebAssembly app based on the Blazor project template. The `WeatherForecastPreserveState` component persists weather forecast state during prerendering and then retrieves the state to initialize the component. The [Persist Component State Tag Helper](xref:mvc/views/tag-helpers/builtin-th/persist-component-state-tag-helper) persists the component state after all component invocations.
-
-`Pages/WeatherForecastPreserveState.razor`:
-
-```razor
-@page "/weather-forecast-preserve-state"
-@using BlazorSample.Shared
-@implements IDisposable
-@inject IWeatherForecastService WeatherForecastService
-@inject PersistentComponentState ApplicationState
-
-Weather Forecast
-
-Weather forecast
-
-This component demonstrates fetching data from the server.
-
-@if (forecasts == null)
-{
- Loading...
-}
-else
-{
-
-
-
- Date
- Temp. (C)
- Temp. (F)
- Summary
-
-
-
- @foreach (var forecast in forecasts)
- {
-
- @forecast.Date.ToShortDateString()
- @forecast.TemperatureC
- @forecast.TemperatureF
- @forecast.Summary
-
- }
-
-
-}
-
-@code {
- private WeatherForecast[] forecasts = Array.Empty();
- private PersistingComponentStateSubscription persistingSubscription;
-
- protected override async Task OnInitializedAsync()
- {
- persistingSubscription =
- ApplicationState.RegisterOnPersisting(PersistForecasts);
-
- if (!ApplicationState.TryTakeFromJson(
- "fetchdata", out var restored))
- {
- forecasts =
- await WeatherForecastService.GetForecastAsync(DateOnly.FromDateTime(DateTime.Now));
- }
- else
- {
- forecasts = restored!;
- }
- }
-
- private Task PersistForecasts()
- {
- ApplicationState.PersistAsJson("fetchdata", forecasts);
-
- return Task.CompletedTask;
- }
-
- void IDisposable.Dispose()
- {
- persistingSubscription.Dispose();
- }
-}
-```
-
-By initializing components with the same state used during prerendering, any expensive initialization steps are only executed once. The rendered UI also matches the prerendered UI, so no flicker occurs in the browser.
-
-The persisted prerendered state is transferred to the client, where it's used to restore the component state. [ASP.NET Core Data Protection](xref:security/data-protection/introduction) ensures that the data is transferred securely in Blazor Server apps. For prerendering in a hosted Blazor WebAssembly app, the data is exposed to the browser and must not contain sensitive, private information.
-
-:::zone pivot="webassembly"
-
-## Additional Blazor WebAssembly resources
-
-* [State management: Handle prerendering](xref:blazor/state-management#handle-prerendering)
-* [Prerendering support with assembly lazy loading](xref:blazor/webassembly-lazy-load-assemblies#lazy-load-assemblies-in-a-hosted-blazor-webassembly-solution)
-* Razor component lifecycle subjects that pertain to prerendering
- * [Component initialization (`OnInitialized{Async}`)](xref:blazor/components/lifecycle#component-initialization-oninitializedasync)
- * [After component render (`OnAfterRender{Async}`)](xref:blazor/components/lifecycle#after-component-render-onafterrenderasync)
- * [Stateful reconnection after prerendering](xref:blazor/components/lifecycle#stateful-reconnection-after-prerendering): Although the content in the section focuses on Blazor Server and stateful SignalR *reconnection*, the scenario for prerendering in hosted Blazor WebAssembly apps () involves similar conditions and approaches to prevent executing developer code twice. To preserve state during the execution of initialization code while prerendering, see *Persist prerendered state* section of this article.
- * [Prerendering with JavaScript interop](xref:blazor/components/lifecycle#prerendering-with-javascript-interop)
-* Authentication and authorization subjects that pertain to prerendering
- * [General aspects](xref:blazor/security/index)
- * [Prerendering with authentication in hosted Blazor WebAssembly apps](xref:blazor/security/webassembly/additional-scenarios#prerendering-with-authentication)
-* [Host and deploy: Blazor WebAssembly](xref:blazor/host-and-deploy/webassembly)
-* [Handle errors: Prerendering](xref:blazor/fundamentals/handle-errors#prerendering)
-* is executed *twice* when prerendering: [Handle asynchronous navigation events with `OnNavigateAsync`](xref:blazor/fundamentals/routing#handle-asynchronous-navigation-events-with-onnavigateasync)
-
-:::zone-end
-
-:::zone pivot="server"
-
-## Prerendered state size and SignalR message size limit
-
-A large prerendered state size may exceed the SignalR circuit message size limit, which results in the following:
-
-* The SignalR circuit fails to initialize with an error on the client: :::no-loc text="Circuit host not initialized.":::
-* The reconnection UI on the client appears when the circuit fails. Recovery isn't possible.
-
-To resolve the problem, use ***either*** of the following approaches:
-
-* Reduce the amount of data that you are putting into the prerendered state.
-* Increase the [SignalR message size limit](xref:blazor/fundamentals/signalr#server-side-circuit-handler-options). ***WARNING***: Increasing the limit may increase the risk of Denial of Service (DoS) attacks.
-
-## Additional Blazor Server resources
-
-* [State management: Handle prerendering](xref:blazor/state-management#handle-prerendering)
-* Razor component lifecycle subjects that pertain to prerendering
- * [Component initialization (`OnInitialized{Async}`)](xref:blazor/components/lifecycle#component-initialization-oninitializedasync)
- * [After component render (`OnAfterRender{Async}`)](xref:blazor/components/lifecycle#after-component-render-onafterrenderasync)
- * [Stateful reconnection after prerendering](xref:blazor/components/lifecycle#stateful-reconnection-after-prerendering)
- * [Prerendering with JavaScript interop](xref:blazor/components/lifecycle#prerendering-with-javascript-interop)
-* [Authentication and authorization: General aspects](xref:blazor/security/index#aspnet-core-blazor-authentication-and-authorization)
-* [Handle Errors: Prerendering](xref:blazor/fundamentals/handle-errors#prerendering)
-* [Host and deploy: Blazor Server](xref:blazor/host-and-deploy/server)
-* [Threat mitigation: Cross-site scripting (XSS)](xref:blazor/security/server/interactive-server-side-rendering#cross-site-scripting-xss)
-* is executed *twice* when prerendering: [Handle asynchronous navigation events with `OnNavigateAsync`](xref:blazor/fundamentals/routing#handle-asynchronous-navigation-events-with-onnavigateasync)
-
-:::zone-end
-
-:::moniker-end
-
-:::moniker range=">= aspnetcore-6.0 < aspnetcore-7.0"
-
-:::zone pivot="webassembly"
-
-Razor components can be integrated into Razor Pages and MVC apps in a hosted Blazor WebAssembly [solution](xref:blazor/tooling#visual-studio-solution-file-sln). When the page or view is rendered, components can be prerendered at the same time.
-
-Prerendering can improve [Search Engine Optimization (SEO)](https://developer.mozilla.org/docs/Glossary/SEO) by rendering content for the initial HTTP response that search engines can use to calculate page rank.
-
-## Solution configuration
-
-### Prerendering configuration
-
-To set up prerendering for a hosted Blazor WebAssembly app:
-
-1. Host the Blazor WebAssembly app in an ASP.NET Core app. A standalone Blazor WebAssembly app can be added to an ASP.NET Core solution, or you can use a hosted Blazor WebAssembly app created from the [Blazor WebAssembly project template](xref:blazor/tooling) with the hosted option:
-
- * Visual Studio: In the **Additional information** dialog, select the **ASP.NET Core Hosted** checkbox when creating the Blazor WebAssembly app. In this article's examples, the solution is named `BlazorHosted`.
- * Visual Studio Code/.NET CLI command shell: `dotnet new blazorwasm -ho` (use the `-ho|--hosted` option). Use the `-o|--output {LOCATION}` option to create a folder for the solution and set the solution's project namespaces. In this article's examples, the solution is named `BlazorHosted` (`dotnet new blazorwasm -ho -o BlazorHosted`).
-
- For the examples in this article, the client project's namespace is `BlazorHosted.Client`, and the server project's namespace is `BlazorHosted.Server`.
-
-1. **Delete** the `wwwroot/index.html` file from the Blazor WebAssembly **:::no-loc text="Client":::** project.
-
-1. In the **:::no-loc text="Client":::** project, **delete** the following lines in `Program.cs`:
-
- ```diff
- - builder.RootComponents.Add("#app");
- - builder.RootComponents.Add("head::after");
- ```
-
-1. Add `_Host.cshtml` and `_Layout.cshtml` files to the **:::no-loc text="Server":::** project's `Pages` folder. You can obtain the files from a project created from the Blazor Server template using Visual Studio or using the .NET CLI with the `dotnet new blazorserver -o BlazorServer` command in a command shell (the `-o BlazorServer` option creates a folder for the project). After placing the files into the **:::no-loc text="Server":::** project's `Pages` folder, make the following changes to the files.
-
- > [!IMPORTANT]
- > The use of a layout page (`_Layout.cshtml`) with a [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) for a component is required to control `` content, such as the page's title ( component) and other head elements ( component). For more information, see .
-
- Make the following changes to the `_Layout.cshtml` file:
-
- * Update the `Pages` namespace at the top of the file to match the namespace of the **:::no-loc text="Server":::** app's pages. The `{APP NAMESPACE}` placeholder in the following example represents the namespace of the donor app's pages that provided the `_Layout.cshtml` file:
-
- Delete:
-
- ```diff
- - @namespace {APP NAMESPACE}.Pages
- ```
-
- Add:
-
- ```razor
- @namespace BlazorHosted.Server.Pages
- ```
-
- * Add an [`@using`](xref:mvc/views/razor#using) directive for the **:::no-loc text="Client":::** project at the top of the file:
-
- ```razor
- @using BlazorHosted.Client
- ```
-
- * Update the stylesheet links to point to the WebAssembly project's stylesheets. In the following example, the client project's namespace is `BlazorHosted.Client`. The `{APP NAMESPACE}` placeholder represents the namespace of the donor app that provided the `_Layout.cshtml` file. Update the Component Tag Helper (`` tag) for the `HeadOutlet` component to prerender the component.
-
- Delete:
-
- ```diff
- -
- -
- -
- ```
-
- Add:
-
- ```cshtml
-
-
-
- ```
-
- > [!NOTE]
- > Leave the ` ` element that requests the Bootstrap stylesheet (`css/bootstrap/bootstrap.min.css`) in place.
-
- * Update the Blazor script source to use the client-side Blazor WebAssembly script:
-
- Delete:
-
- ```diff
- -
- ```
-
- Add:
-
- ```html
-
- ```
-
- In the `_Host.cshtml` file:
-
- * Change the `Pages` namespace to that of the **:::no-loc text="Client":::** project. The `{APP NAMESPACE}` placeholder represents the namespace of the donor app's pages that provided the `_Host.cshtml` file:
-
- Delete:
-
- ```diff
- - @namespace {APP NAMESPACE}.Pages
- ```
-
- Add:
-
- ```razor
- @namespace BlazorHosted.Client
- ```
-
- * Update the `render-mode` of the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) to prerender the root `App` component with :
-
- Delete:
-
- ```diff
- -
- ```
-
- Add:
-
- ```cshtml
-
- ```
-
- > [!IMPORTANT]
- > Prerendering isn't supported for authentication endpoints (`/authentication/` path segment). For more information, see .
-
-1. In endpoint mapping of the **:::no-loc text="Server":::** project in `Program.cs`, change the fallback from the `index.html` file to the `_Host.cshtml` page:
-
- Delete:
-
- ```diff
- - app.MapFallbackToFile("index.html");
- ```
-
- Add:
-
- ```csharp
- app.MapFallbackToPage("/_Host");
- ```
-
-1. If the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** projects use one or more common services during prerendering, factor the service registrations into a method that can be called from both projects. For more information, see .
-
-1. Run the **:::no-loc text="Server":::** project. The hosted Blazor WebAssembly app is prerendered by the **:::no-loc text="Server":::** project for clients.
-
-### Configuration for embedding Razor components into pages and views
-
-The following sections and examples for embedding Razor components from the **:::no-loc text="Client":::** Blazor WebAssembly app into pages and views of the server app require additional configuration.
-
-The **:::no-loc text="Server":::** project must have the following files and folders.
-
-Razor Pages:
-
-* `Pages/Shared/_Layout.cshtml`
-* `Pages/Shared/_Layout.cshtml.css`
-* `Pages/_ViewImports.cshtml`
-* `Pages/_ViewStart.cshtml`
-
-MVC:
-
-* `Views/Shared/_Layout.cshtml`
-* `Views/Shared/_Layout.cshtml.css`
-* `Views/_ViewImports.cshtml`
-* `Views/_ViewStart.cshtml`
-
-> [!IMPORTANT]
-> The use of a layout page (`_Layout.cshtml`) with a [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) for a component is required to control `` content, such as the page's title ( component) and other head elements ( component). For more information, see .
-
-The preceding files can be obtained by generating an app from the ASP.NET Core project templates using:
-
-* Visual Studio's new project creation tools.
-* Opening a command shell and executing `dotnet new webapp -o {PROJECT NAME}` (Razor Pages) or `dotnet new mvc -o {PROJECT NAME}` (MVC). The option `-o|--output` with a value for the `{PROJECT NAME}` placeholder provides a name for the app and creates a folder for the app.
-
-Update the namespaces in the imported `_ViewImports.cshtml` file to match those in use by the **:::no-loc text="Server":::** project receiving the files.
-
-`Pages/_ViewImports.cshtml` (Razor Pages):
-
-```razor
-@using BlazorHosted.Server
-@namespace BlazorHosted.Server.Pages
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
-```
-
-`Views/_ViewImports.cshtml` (MVC):
-
-```razor
-@using BlazorHosted.Server
-@using BlazorHosted.Server.Models
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
-```
-
-Update the imported layout file, which is `Pages/Shared/_Layout.cshtml` for Razor Pages or `Views/Shared/_Layout.cshtml` for MVC.
-
-First, delete the title and the stylesheet from the donor project, which is `RPDonor.styles.css` in the following example. The `{PROJECT NAME}` placeholder represents the donor project's app name.
-
-```diff
-- @ViewData["Title"] - {PROJECT NAME}
--
-```
-
-Include the **:::no-loc text="Client":::** project's styles in the layout file. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`. The `` element can be updated at the same time.
-
-Place the following lines in the `` content of the layout file:
-
-```cshtml
-@ViewData["Title"] - BlazorHosted
-
-
-
-```
-
-The imported layout contains two `Home` (`Index` page) and `Privacy` navigation links. To make the `Home` links point to the hosted Blazor WebAssembly app, change the hyperlinks:
-
-```diff
-- {PROJECT NAME}
-+ BlazorHosted
-```
-
-```diff
-- Home
-+ Home
-```
-
-In an MVC layout file:
-
-```diff
-- {PROJECT NAME}
-+ BlazorHosted
-```
-
-```diff
-- Home
-+ Home
-```
-
-Update the `` element's app name. The following example uses the app name `BlazorHosted`:
-
-```diff
-- © {DATE} - {DONOR NAME} - Privacy
-+ © {DATE} - BlazorHosted - Privacy
-```
-
-In the preceding example, the `{DATE}` placeholder represents the copyright date in an app generated from the Razor Pages or MVC project template.
-
-To make the `Privacy` link lead to a privacy page (Razor Pages), add a privacy page to the **:::no-loc text="Server":::** project.
-
-`Pages/Privacy.cshtml` in the **:::no-loc text="Server":::** project:
-
-```cshtml
-@page
-@model PrivacyModel
-@{
- ViewData["Title"] = "Privacy Policy";
-}
-@ViewData["Title"]
-
-Use this page to detail your site's privacy policy.
-```
-
-For an MVC-based privacy view, create a privacy view in the **:::no-loc text="Server":::** project.
-
-`View/Home/Privacy.cshtml` in the **:::no-loc text="Server":::** project:
-
-```cshtml
-@{
- ViewData["Title"] = "Privacy Policy";
-}
-@ViewData["Title"]
-
-Use this page to detail your site's privacy policy.
-```
-
-In the `Home` controller of the MVC app, return the view.
-
-Add the following code to `Controllers/HomeController.cs`:
-
-```csharp
-public IActionResult Privacy()
-{
- return View();
-}
-```
-
-If you import files from a donor app, be sure to update any namespaces in the files to match that of the **:::no-loc text="Server":::** project (for example, `BlazorHosted.Server`).
-
-Import static assets to the **:::no-loc text="Server":::** project from the donor project's `wwwroot` folder:
-
-* `wwwroot/css` folder and contents
-* `wwwroot/js` folder and contents
-* `wwwroot/lib` folder and contents
-
-If the donor project is created from an ASP.NET Core project template and the files aren't modified, you can copy the entire `wwwroot` folder from the donor project into the **:::no-loc text="Server":::** project and remove the :::no-loc text="favicon"::: icon file.
-
-> [!WARNING]
-> Avoid placing the static asset into both the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** `wwwroot` folders. If the same file is present in both folders, an exception is thrown because the static asset in each folder shares the same web root path. Therefore, host a static asset in either `wwwroot` folder, not both.
-
-After adopting the preceding configuration, embed Razor components into pages or views of the **:::no-loc text="Server":::** project. Use the guidance in the following sections of this article:
-
-* *Render components in a page or view with the Component Tag Helper*
-* *Render components in a page or view with a CSS selector*
-
-## Render components in a page or view with the Component Tag Helper
-
-After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-and-views), the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) supports two render modes for rendering a component from a Blazor WebAssembly app in a page or view:
-
-*
-*
-
-In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections). To avoid using the full namespace for the `Counter` component with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) (`{ASSEMBLY NAME}.Pages.Counter`), add an [`@using`](xref:mvc/views/razor#using) directive for the client project's `Pages` namespace. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
-
-In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter1.cshtml`:
+ data = restored!;
+ }
+ }
-```cshtml
-@page
-@using BlazorHosted.Client.Pages
+ private Task PersistData()
+ {
+ ApplicationState.PersistAsJson("{TOKEN}", data);
-
+ return Task.CompletedTask;
+ }
-@section Scripts {
-
+ void IDisposable.Dispose()
+ {
+ persistingSubscription.Dispose();
+ }
}
```
-Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter1`. The prerendered `Counter` component is embedded in the page.
-
- configures whether the component:
+The following example is an updated version of the `FetchData` component based on the Blazor project template. The `WeatherForecastPreserveState` component persists weather forecast state during prerendering and then retrieves the state to initialize the component. The [Persist Component State Tag Helper](xref:mvc/views/tag-helpers/builtin-th/persist-component-state-tag-helper) persists the component state after all component invocations.
-* Is prerendered into the page.
-* Is rendered as static HTML on the page or if it includes the necessary information to bootstrap a Blazor app from the user agent.
-
-For more information on the Component Tag Helper, including passing parameters and configuration, see .
+`Pages/WeatherForecastPreserveState.razor`:
-Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
+```razor
+@page "/weather-forecast-preserve-state"
+@using BlazorSample.Shared
+@implements IDisposable
+@inject IWeatherForecastService WeatherForecastService
+@inject PersistentComponentState ApplicationState
-### Set child content through a render fragment
+Weather Forecast
-The [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) doesn't support receiving a [`RenderFragment` delegate for child content](xref:blazor/components/index#child-content-render-fragments) (for example, `param-ChildContent="..."`). We recommend creating a Razor component (`.razor`) that references the component you want to render with the child content you want to pass and then invoke the Razor component from the page or view.
+Weather forecast
-### Ensure that top-level prerendered components aren't trimmed out on publish
+This component demonstrates fetching data from the server.
-If a [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) directly references a component from a library that's subject to trimming on publish, the component might be trimmed out during publish because there are no references to it from client-side app code. As a result, the component isn't prerendered, leaving a blank spot in the output. If this occurs, instruct the trimmer to preserve the library component by adding a [`DynamicDependency` attribute](xref:System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute) to any class in the client-side app. To preserve a component called `SomeLibraryComponentToBePreserved`, add the following to any component:
+@if (forecasts == null)
+{
+ Loading...
+}
+else
+{
+
+
+
+ Date
+ Temp. (C)
+ Temp. (F)
+ Summary
+
+
+
+ @foreach (var forecast in forecasts)
+ {
+
+ @forecast.Date.ToShortDateString()
+ @forecast.TemperatureC
+ @forecast.TemperatureF
+ @forecast.Summary
+
+ }
+
+
+}
-```razor
-@using System.Diagnostics.CodeAnalysis
-@attribute [DynamicDependency(DynamicallyAccessedMemberTypes.All,
- typeof(SomeLibraryComponentToBePreserved))]
-```
+@code {
+ private WeatherForecast[] forecasts = Array.Empty();
+ private PersistingComponentStateSubscription persistingSubscription;
-The preceding approach usually isn't required because the app usually prerenders its components (which are not trimmed), which in turn references components from libraries (causing them also not to be trimmed). Only use `DynamicDependency` explicitly for prerendering a library component directly when the library is subject to trimming.
+ protected override async Task OnInitializedAsync()
+ {
+ persistingSubscription =
+ ApplicationState.RegisterOnPersisting(PersistForecasts);
-## Render components in a page or view with a CSS selector
+ if (!ApplicationState.TryTakeFromJson(
+ "fetchdata", out var restored))
+ {
+ forecasts =
+ await WeatherForecastService.GetForecastAsync(DateOnly.FromDateTime(DateTime.Now));
+ }
+ else
+ {
+ forecasts = restored!;
+ }
+ }
-After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-and-views), add root components to the **:::no-loc text="Client":::** project of a hosted Blazor WebAssembly solution in the `Program.cs` file. In the following example, the `Counter` component is declared as a root component with a CSS selector that selects the element with the `id` that matches `counter-component`. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
+ private Task PersistForecasts()
+ {
+ ApplicationState.PersistAsJson("fetchdata", forecasts);
-In `Program.cs` file of the **:::no-loc text="Client":::** project, add the namespace for the project's Razor components to the top of the file:
+ return Task.CompletedTask;
+ }
-```csharp
-using BlazorHosted.Client.Pages;
+ void IDisposable.Dispose()
+ {
+ persistingSubscription.Dispose();
+ }
+}
```
-After the `builder` is established in `Program.cs`, add the `Counter` component as a root component:
-
-```csharp
-builder.RootComponents.Add("#counter-component");
-```
+By initializing components with the same state used during prerendering, any expensive initialization steps are only executed once. The rendered UI also matches the prerendered UI, so no flicker occurs in the browser.
-In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections).
+The persisted prerendered state is transferred to the client, where it's used to restore the component state. [ASP.NET Core Data Protection](xref:security/data-protection/introduction) ensures that the data is transferred securely in Blazor Server apps.
-In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter2.cshtml`:
+## Prerendered state size and SignalR message size limit
-```cshtml
-@page
+A large prerendered state size may exceed the SignalR circuit message size limit, which results in the following:
-Loading...
+* The SignalR circuit fails to initialize with an error on the client: :::no-loc text="Circuit host not initialized.":::
+* The reconnection UI on the client appears when the circuit fails. Recovery isn't possible.
-@section Scripts {
-
-}
-```
+To resolve the problem, use ***either*** of the following approaches:
-Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter2`. The prerendered `Counter` component is embedded in the page.
+* Reduce the amount of data that you are putting into the prerendered state.
+* Increase the [SignalR message size limit](xref:blazor/fundamentals/signalr#server-side-circuit-handler-options). ***WARNING***: Increasing the limit may increase the risk of Denial of Service (DoS) attacks.
-Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
+## Additional Blazor Server resources
-> [!NOTE]
-> The preceding example throws a if a Blazor WebAssembly app is prerendered and integrated into a Razor Pages or MVC app **simultaneously** with the use of a CSS selector. Navigating to one of the **:::no-loc text="Client":::** project's Razor components or navigating to a page or view of the **:::no-loc text="Server":::** with an embedded component throws one or more .
->
-> This is normal behavior because prerendering and integrating a Blazor WebAssembly app with routable Razor components is incompatible with the use of CSS selectors.
->
-> If you've been working with the examples in the preceding sections and just wish to see the CSS selector work in your sample app, comment out the specification of the `App` root component of the **:::no-loc text="Client":::** project's `Program.cs` file:
->
-> ```diff
-> - builder.RootComponents.Add("#app");
-> + //builder.RootComponents.Add("#app");
-> ```
->
-> Navigate to the page or view with the embedded Razor component that uses a CSS selector (for example, `/razorpagescounter2` of the preceding example). The page or view loads with the embedded component, and the embedded component functions as expected.
+* [State management: Handle prerendering](xref:blazor/state-management#handle-prerendering)
+* Razor component lifecycle subjects that pertain to prerendering
+ * [Component initialization (`OnInitialized{Async}`)](xref:blazor/components/lifecycle#component-initialization-oninitializedasync)
+ * [After component render (`OnAfterRender{Async}`)](xref:blazor/components/lifecycle#after-component-render-onafterrenderasync)
+ * [Stateful reconnection after prerendering](xref:blazor/components/lifecycle#stateful-reconnection-after-prerendering)
+ * [Prerendering with JavaScript interop](xref:blazor/components/lifecycle#prerendering-with-javascript-interop)
+* [Authentication and authorization: General aspects](xref:blazor/security/index#aspnet-core-blazor-authentication-and-authorization)
+* [Handle Errors: Prerendering](xref:blazor/fundamentals/handle-errors#prerendering)
+* [Host and deploy: Blazor Server](xref:blazor/host-and-deploy/server)
+* [Threat mitigation: Cross-site scripting (XSS)](xref:blazor/security/server/interactive-server-side-rendering#cross-site-scripting-xss)
+* is executed *twice* when prerendering: [Handle asynchronous navigation events with `OnNavigateAsync`](xref:blazor/fundamentals/routing#handle-asynchronous-navigation-events-with-onnavigateasync)
-:::zone-end
+:::moniker-end
-:::zone pivot="server"
+:::moniker range=">= aspnetcore-6.0 < aspnetcore-7.0"
-Razor components can be integrated into Razor Pages and MVC apps. When the page or view is rendered, components can be prerendered at the same time.
-
Prerendering can improve [Search Engine Optimization (SEO)](https://developer.mozilla.org/docs/Glossary/SEO) by rendering content for the initial HTTP response that search engines can use to calculate page rank.
After [configuring the project](#configuration), use the guidance in the following sections depending on the project's requirements:
@@ -1380,11 +571,11 @@ After [configuring the project](#configuration), use the guidance in the followi
* Routable components: For components that are directly routable from user requests. Follow this guidance when visitors should be able to make an HTTP request in their browser for a component with an [`@page`](xref:mvc/views/razor#page) directive.
* [Use routable components in a Razor Pages app](#use-routable-components-in-a-razor-pages-app)
* [Use routable components in an MVC app](#use-routable-components-in-an-mvc-app)
-* [Render components from a page or view](#render-components-from-a-page-or-view): For components that aren't directly routable from user requests. Follow this guidance when the app embeds components into existing pages and views with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper).
+* [Render components from a page or view](#render-components-from-a-page-or-view): For components that aren't directly routable from user requests. Follow this guidance when the app embeds components into existing pages or views with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper).
## Configuration
-Use the following guidance to integrate Razor components into pages and views of an existing Razor Pages or MVC app.
+Use the following guidance to integrate Razor components into pages or views of an existing Razor Pages or MVC app.
> [!IMPORTANT]
> The use of a layout page (`_Layout.cshtml`) with a [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) for a component is required to control `` content, such as the page's title ( component) and other head elements ( component). For more information, see .
@@ -1759,8 +950,6 @@ The `_ViewImports.cshtml` file is located in the `Pages` folder of a Razor Pages
For more information, see .
-:::zone-end
-
## Persist prerendered state
Without persisting prerendered state, state used during prerendering is lost and must be recreated when the app is fully loaded. If any state is setup asynchronously, the UI may flicker as the prerendered UI is replaced with temporary placeholders and then fully rendered again.
@@ -1779,7 +968,7 @@ To solve these problems, Blazor supports persisting state in a prerendered page
Decide what state to persist using the service. [`PersistentComponentState.RegisterOnPersisting`](xref:Microsoft.AspNetCore.Components.PersistentComponentState.RegisterOnPersisting%2A) registers a callback to persist the component state before the app is paused. The state is retrieved when the application resumes.
-The following example is an updated version of the `FetchData` component in a hosted Blazor WebAssembly app based on the Blazor project template. The `WeatherForecastPreserveState` component persists weather forecast state during prerendering and then retrieves the state to initialize the component. The [Persist Component State Tag Helper](xref:mvc/views/tag-helpers/builtin-th/persist-component-state-tag-helper) persists the component state after all component invocations.
+The following example is an updated version of the `FetchData` component based on the Blazor project template. The `WeatherForecastPreserveState` component persists weather forecast state during prerendering and then retrieves the state to initialize the component. The [Persist Component State Tag Helper](xref:mvc/views/tag-helpers/builtin-th/persist-component-state-tag-helper) persists the component state after all component invocations.
`Pages/WeatherForecastPreserveState.razor`:
@@ -1862,28 +1051,8 @@ else
By initializing components with the same state used during prerendering, any expensive initialization steps are only executed once. The rendered UI also matches the prerendered UI, so no flicker occurs in the browser.
-The persisted prerendered state is transferred to the client, where it's used to restore the component state. [ASP.NET Core Data Protection](xref:security/data-protection/introduction) ensures that the data is transferred securely in Blazor Server apps. For prerendering in a hosted Blazor WebAssembly app, the data is exposed to the browser and must not contain sensitive, private information.
+The persisted prerendered state is transferred to the client, where it's used to restore the component state. [ASP.NET Core Data Protection](xref:security/data-protection/introduction) ensures that the data is transferred securely in Blazor Server apps.
-:::zone pivot="webassembly"
-
-## Additional Blazor WebAssembly resources
-
-* [State management: Handle prerendering](xref:blazor/state-management#handle-prerendering)
-* [Prerendering support with assembly lazy loading](xref:blazor/webassembly-lazy-load-assemblies#lazy-load-assemblies-in-a-hosted-blazor-webassembly-solution)
-* Razor component lifecycle subjects that pertain to prerendering
- * [Component initialization (`OnInitialized{Async}`)](xref:blazor/components/lifecycle#component-initialization-oninitializedasync)
- * [After component render (`OnAfterRender{Async}`)](xref:blazor/components/lifecycle#after-component-render-onafterrenderasync)
- * [Stateful reconnection after prerendering](xref:blazor/components/lifecycle#stateful-reconnection-after-prerendering): Although the content in the section focuses on Blazor Server and stateful SignalR *reconnection*, the scenario for prerendering in hosted Blazor WebAssembly apps () involves similar conditions and approaches to prevent executing developer code twice. To preserve state during the execution of initialization code while prerendering, see *Persist prerendered state* section of this article.
- * [Prerendering with JavaScript interop](xref:blazor/components/lifecycle#prerendering-with-javascript-interop)
-* Authentication and authorization subjects that pertain to prerendering
- * [General aspects](xref:blazor/security/index#aspnet-core-blazor-authentication-and-authorization)
- * [Prerendering with authentication](xref:blazor/security/webassembly/additional-scenarios#prerendering-with-authentication)
-* [Host and deploy: Blazor WebAssembly](xref:blazor/host-and-deploy/webassembly)
-
-:::zone-end
-
-:::zone pivot="server"
-
## Prerendered state size and SignalR message size limit
A large prerendered state size may exceed the SignalR circuit message size limit, which results in the following:
@@ -1909,262 +1078,10 @@ To resolve the problem, use ***either*** of the following approaches:
* [Host and deploy: Blazor Server](xref:blazor/host-and-deploy/server)
* [Threat mitigation: Cross-site scripting (XSS)](xref:blazor/security/server/interactive-server-side-rendering#cross-site-scripting-xss)
-:::zone-end
-
:::moniker-end
:::moniker range=">= aspnetcore-5.0 < aspnetcore-6.0"
-:::zone pivot="webassembly"
-
-Razor components can be integrated into Razor Pages and MVC apps in a hosted Blazor WebAssembly [solution](xref:blazor/tooling#visual-studio-solution-file-sln). When the page or view is rendered, components can be prerendered at the same time.
-
-Prerendering can improve [Search Engine Optimization (SEO)](https://developer.mozilla.org/docs/Glossary/SEO) by rendering content for the initial HTTP response that search engines can use to calculate page rank.
-
-## Solution configuration
-
-### Prerendering configuration
-
-To set up prerendering for a hosted Blazor WebAssembly app:
-
-1. Host the Blazor WebAssembly app in an ASP.NET Core app. A standalone Blazor WebAssembly app can be added to an ASP.NET Core solution, or you can use a hosted Blazor WebAssembly app created from the [Blazor WebAssembly project template](xref:blazor/tooling) with the hosted option:
-
- * Visual Studio: In the **Additional information** dialog, select the **ASP.NET Core Hosted** checkbox when creating the Blazor WebAssembly app. In this article's examples, the solution is named `BlazorHosted`.
- * Visual Studio Code/.NET CLI command shell: `dotnet new blazorwasm -ho` (use the `-ho|--hosted` option). Use the `-o|--output {LOCATION}` option to create a folder for the solution and set the solution's project namespaces. In this article's examples, the solution is named `BlazorHosted` (`dotnet new blazorwasm -ho -o BlazorHosted`).
-
- For the examples in this article, the client project's namespace is `BlazorHosted.Client`, and the server project's namespace is `BlazorHosted.Server`.
-
-1. **Delete** the `wwwroot/index.html` file from the Blazor WebAssembly **:::no-loc text="Client":::** project.
-
-1. In the **:::no-loc text="Client":::** project, **delete** the following line in `Program.cs`:
-
- ```diff
- - builder.RootComponents.Add("#app");
- ```
-
-1. Add a `Pages/_Host.cshtml` file to the **:::no-loc text="Server":::** project's `Pages` folder. You can obtain a `_Host.cshtml` file from a project created from the Blazor Server template with the `dotnet new blazorserver -o BlazorServer` command in a command shell (the `-o BlazorServer` option creates a folder for the project). After placing the `Pages/_Host.cshtml` file into the **:::no-loc text="Server":::** project of the hosted Blazor WebAssembly solution, make the following changes to the file:
-
- * Provide an [`@using`](xref:mvc/views/razor#using) directive for the **:::no-loc text="Client":::** project (for example, `@using BlazorHosted.Client`).
- * Update the stylesheet links to point to the WebAssembly project's stylesheets. In the following example, the client project's namespace is `BlazorHosted.Client`:
-
- ```diff
- -
- -
- +
- +
- ```
-
- > [!NOTE]
- > Leave the ` ` element that requests the Bootstrap stylesheet (`css/bootstrap/bootstrap.min.css`) in place.
-
- * Update the `render-mode` of the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) to prerender the root `App` component with :
-
- ```diff
- -
- +
- ```
-
- * Update the Blazor script source to use the client-side Blazor WebAssembly script:
-
- ```diff
- -
- +
- ```
-
-1. In `Startup.Configure` of the **:::no-loc text="Server":::** project, change the fallback from the `index.html` file to the `_Host.cshtml` page.
-
- `Startup.cs`:
-
- ```diff
- - endpoints.MapFallbackToFile("index.html");
- + endpoints.MapFallbackToPage("/_Host");
- ```
-
-1. If the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** projects use one or more common services during prerendering, factor the service registrations into a method that can be called from both projects. For more information, see .
-
-1. Run the **:::no-loc text="Server":::** project. The hosted Blazor WebAssembly app is prerendered by the **:::no-loc text="Server":::** project for clients.
-
-### Configuration for embedding Razor components into pages and views
-
-The following sections and examples in this article for embedding Razor components of the client Blazor WebAssembly app into pages and views of the server app require additional configuration.
-
-Use a default Razor Pages or MVC layout file in the **:::no-loc text="Server":::** project. The **:::no-loc text="Server":::** project must have the following files and folders.
-
-Razor Pages:
-
-* `Pages/Shared/_Layout.cshtml`
-* `Pages/_ViewImports.cshtml`
-* `Pages/_ViewStart.cshtml`
-
-MVC:
-
-* `Views/Shared/_Layout.cshtml`
-* `Views/_ViewImports.cshtml`
-* `Views/_ViewStart.cshtml`
-
-Obtain the preceding files from an app created from the Razor Pages or MVC project template. For more information, see or .
-
-Update the namespaces in the imported `_ViewImports.cshtml` file to match those in use by the **:::no-loc text="Server":::** project receiving the files.
-
-Update the imported layout file (`_Layout.cshtml`) to include the **:::no-loc text="Client":::** project's styles. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`. The `` element can be updated at the same time.
-
-`Pages/Shared/_Layout.cshtml` (Razor Pages) or `Views/Shared/_Layout.cshtml` (MVC):
-
-```diff
-
-
-
-- @ViewData["Title"] - DonorProject
-+ @ViewData["Title"] - BlazorHosted
-
-
-+
-+
-
-```
-
-The imported layout contains `Home` and `Privacy` navigation links. To make the `Home` link point to the hosted Blazor WebAssembly app, change the hyperlink:
-
-```diff
-- Home
-+ Home
-```
-
-In an MVC layout file:
-
-```diff
-- Home
-+ Home
-```
-
-To make the `Privacy` link lead to a privacy page, add a privacy page to the **:::no-loc text="Server":::** project.
-
-`Pages/Privacy.cshtml` in the **:::no-loc text="Server":::** project:
-
-```cshtml
-@page
-@model BlazorHosted.Server.Pages.PrivacyModel
-@{
-}
-
-Privacy Policy
-```
-
-If an MVC-based privacy view is preferred, create a privacy view in the **:::no-loc text="Server":::** project.
-
-`View/Home/Privacy.cshtml`:
-
-```cshtml
-@{
- ViewData["Title"] = "Privacy Policy";
-}
-
-@ViewData["Title"]
-```
-
-In the `Home` controller, return the view.
-
-`Controllers/HomeController.cs`:
-
-```csharp
-public IActionResult Privacy()
-{
- return View();
-}
-```
-
-Import static assets to the **:::no-loc text="Server":::** project from the donor project's `wwwroot` folder:
-
-* `wwwroot/css` folder and contents
-* `wwwroot/js` folder and contents
-* `wwwroot/lib` folder and contents
-
-If the donor project is created from an ASP.NET Core project template and the files aren't modified, you can copy the entire `wwwroot` folder from the donor project into the **:::no-loc text="Server":::** project and remove the :::no-loc text="favicon"::: icon file.
-
-> [!WARNING]
-> Avoid placing the static asset into both the **:::no-loc text="Client":::** and **:::no-loc text="Server":::** `wwwroot` folders. If the same file is present in both folders, an exception is thrown because the static asset in each folder shares the same web root path. Therefore, host a static asset in either `wwwroot` folder, not both.
-
-## Render components in a page or view with the Component Tag Helper
-
-After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-and-views), the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) supports two render modes for rendering a component from a Blazor WebAssembly app in a page or view:
-
-*
-*
-
-In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections). To avoid using the full namespace for the `Counter` component with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper) (`{ASSEMBLY NAME}.Pages.Counter`), add an [`@using`](xref:mvc/views/razor#using) directive for the client project's `Pages` namespace. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
-
-In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter1.cshtml`:
-
-```cshtml
-@page
-@using BlazorHosted.Client.Pages
-
-
-
-@section Scripts {
-
-}
-```
-
-Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter1`. The prerendered `Counter` component is embedded in the page.
-
- configures whether the component:
-
-* Is prerendered into the page.
-* Is rendered as static HTML on the page or if it includes the necessary information to bootstrap a Blazor app from the user agent.
-
-For more information on the Component Tag Helper, including passing parameters and configuration, see .
-
-Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
-
-## Render components in a page or view with a CSS selector
-
-After [configuring the solution](#solution-configuration), including the [additional configuration](#configuration-for-embedding-razor-components-into-pages-and-views), add root components to the **:::no-loc text="Client":::** project of a hosted Blazor WebAssembly solution in `Program.cs`. In the following example, the `Counter` component is declared as a root component with a CSS selector that selects the element with the `id` that matches `counter-component`. In the following example, the **:::no-loc text="Client":::** project's namespace is `BlazorHosted.Client`.
-
-In `Program.cs` of the **:::no-loc text="Client":::** project, add the namespace for the project's Razor components to the top of the file:
-
-```csharp
-using BlazorHosted.Client.Pages;
-```
-
-After the `builder` is established in `Program.cs`, add the `Counter` component as a root component:
-
-```csharp
-builder.RootComponents.Add("#counter-component");
-```
-
-In the following Razor Pages example, the `Counter` component is rendered in a page. To make the component interactive, the Blazor WebAssembly script is included in the page's [render section](xref:mvc/views/layout#sections).
-
-In the **:::no-loc text="Server":::** project, `Pages/RazorPagesCounter2.cshtml`:
-
-```cshtml
-@page
-
-Loading...
-
-@section Scripts {
-
-}
-```
-
-Run the **:::no-loc text="Server":::** project. Navigate to the Razor page at `/razorpagescounter2`. The prerendered `Counter` component is embedded in the page.
-
-Additional work might be required depending on the static resources that components use and how layout pages are organized in an app. Typically, scripts are added to a page or view's `Scripts` render section and stylesheets are added to the layout's `` element content.
-
-> [!NOTE]
-> The preceding example throws a if a Blazor WebAssembly app is prerendered and integrated into a Razor Pages or MVC app **simultaneously** with a CSS selector. Navigating to one of the **:::no-loc text="Client":::** project's Razor components throws the following exception:
->
-> > Microsoft.JSInterop.JSException: Could not find any element matching selector '#counter-component'.
->
-> This is normal behavior because prerendering and integrating a Blazor WebAssembly app with routable Razor components is incompatible with the use of CSS selectors.
-
-:::zone-end
-
-:::zone pivot="server"
-
-Razor components can be integrated into Razor Pages and MVC apps. When the page or view is rendered, components can be prerendered at the same time.
-
Prerendering can improve [Search Engine Optimization (SEO)](https://developer.mozilla.org/docs/Glossary/SEO) by rendering content for the initial HTTP response that search engines can use to calculate page rank.
After [configuring the project](#configuration), use the guidance in the following sections depending on the project's requirements:
@@ -2172,11 +1089,11 @@ After [configuring the project](#configuration), use the guidance in the followi
* Routable components: For components that are directly routable from user requests. Follow this guidance when visitors should be able to make an HTTP request in their browser for a component with an [`@page`](xref:mvc/views/razor#page) directive.
* [Use routable components in a Razor Pages app](#use-routable-components-in-a-razor-pages-app)
* [Use routable components in an MVC app](#use-routable-components-in-an-mvc-app)
-* [Render components from a page or view](#render-components-from-a-page-or-view): For components that aren't directly routable from user requests. Follow this guidance when the app embeds components into existing pages and views with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper).
+* [Render components from a page or view](#render-components-from-a-page-or-view): For components that aren't directly routable from user requests. Follow this guidance when the app embeds components into existing pages or views with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper).
## Configuration
-An existing Razor Pages or MVC app can integrate Razor components into pages and views:
+An existing Razor Pages or MVC app can integrate Razor components into pages or views:
1. In the project's layout file:
@@ -2568,28 +1485,6 @@ The `_ViewImports.cshtml` file is located in the `Pages` folder of a Razor Pages
For more information, see .
-:::zone-end
-
-:::zone pivot="webassembly"
-
-## Additional Blazor WebAssembly resources
-
-* [State management: Handle prerendering](xref:blazor/state-management#handle-prerendering)
-* [Prerendering support with assembly lazy loading](xref:blazor/webassembly-lazy-load-assemblies#lazy-load-assemblies-in-a-hosted-blazor-webassembly-solution)
-* Razor component lifecycle subjects that pertain to prerendering
- * [Component initialization (`OnInitialized{Async}`)](xref:blazor/components/lifecycle#component-initialization-oninitializedasync)
- * [After component render (`OnAfterRender{Async}`)](xref:blazor/components/lifecycle#after-component-render-onafterrenderasync)
- * [Stateful reconnection after prerendering](xref:blazor/components/lifecycle#stateful-reconnection-after-prerendering): Although the content in the section focuses on Blazor Server and stateful SignalR *reconnection*, the scenario for prerendering in hosted Blazor WebAssembly apps () involves similar conditions and approaches to prevent executing developer code twice. To preserve state during the execution of initialization code while prerendering, see *Persist prerendered state* section of this article.
- * [Prerendering with JavaScript interop](xref:blazor/components/lifecycle#prerendering-with-javascript-interop)
-* Authentication and authorization subjects that pertain to prerendering
- * [General aspects](xref:blazor/security/index#aspnet-core-blazor-authentication-and-authorization)
- * [Prerendering with authentication](xref:blazor/security/webassembly/additional-scenarios#prerendering-with-authentication)
-* [Host and deploy: Blazor WebAssembly](xref:blazor/host-and-deploy/webassembly)
-
-:::zone-end
-
-:::zone pivot="server"
-
## Prerendered state size and SignalR message size limit
A large prerendered state size may exceed the SignalR circuit message size limit, which results in the following:
@@ -2615,21 +1510,11 @@ To resolve the problem, use ***either*** of the following approaches:
* [Host and deploy: Blazor Server](xref:blazor/host-and-deploy/server)
* [Threat mitigation: Cross-site scripting (XSS)](xref:blazor/security/server/interactive-server-side-rendering#cross-site-scripting-xss)
-:::zone-end
-
:::moniker-end
:::moniker range="< aspnetcore-5.0"
-:::zone pivot="webassembly"
-
-Integrating Razor components into Razor Pages and MVC apps in a hosted Blazor WebAssembly [solution](xref:blazor/tooling#visual-studio-solution-file-sln) is supported in ASP.NET Core in .NET 5 or later. Select a .NET 5 or later version of this article.
-
-:::zone-end
-
-:::zone pivot="server"
-
-Razor components can be integrated into Razor Pages and MVC apps. When the page or view is rendered, components can be prerendered at the same time.
+Razor components can be integrated into Razor Pages or MVC apps. When the page or view is rendered, components can be prerendered at the same time.
Prerendering can improve [Search Engine Optimization (SEO)](https://developer.mozilla.org/docs/Glossary/SEO) by rendering content for the initial HTTP response that search engines can use to calculate page rank.
@@ -2638,11 +1523,11 @@ After [configuring the project](#configuration), use the guidance in the followi
* Routable components: For components that are directly routable from user requests. Follow this guidance when visitors should be able to make an HTTP request in their browser for a component with an [`@page`](xref:mvc/views/razor#page) directive.
* [Use routable components in a Razor Pages app](#use-routable-components-in-a-razor-pages-app)
* [Use routable components in an MVC app](#use-routable-components-in-an-mvc-app)
-* [Render components from a page or view](#render-components-from-a-page-or-view): For components that aren't directly routable from user requests. Follow this guidance when the app embeds components into existing pages and views with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper).
+* [Render components from a page or view](#render-components-from-a-page-or-view): For components that aren't directly routable from user requests. Follow this guidance when the app embeds components into existing pages or views with the [Component Tag Helper](xref:mvc/views/tag-helpers/builtin-th/component-tag-helper).
## Configuration
-An existing Razor Pages or MVC app can integrate Razor components into pages and views:
+An existing Razor Pages or MVC app can integrate Razor components into pages or views:
1. In the project's layout file:
@@ -3055,6 +1940,4 @@ To resolve the problem, use ***either*** of the following approaches:
* [Host and deploy: Blazor Server](xref:blazor/host-and-deploy/server)
* [Threat mitigation: Cross-site scripting (XSS)](xref:blazor/security/server/interactive-server-side-rendering#cross-site-scripting-xss)
-:::zone-end
-
:::moniker-end
diff --git a/aspnetcore/blazor/components/js-spa-frameworks.md b/aspnetcore/blazor/components/js-spa-frameworks.md
index 59fc8115f58b..fd56fdda920d 100644
--- a/aspnetcore/blazor/components/js-spa-frameworks.md
+++ b/aspnetcore/blazor/components/js-spa-frameworks.md
@@ -5,7 +5,7 @@ description: Learn how to create and use Razor components in JavaScript apps and
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/js-spa-frameworks
---
# Use Razor components in JavaScript apps and SPA frameworks
diff --git a/aspnetcore/blazor/components/layouts.md b/aspnetcore/blazor/components/layouts.md
index f643e5460f57..1fa5cf963636 100644
--- a/aspnetcore/blazor/components/layouts.md
+++ b/aspnetcore/blazor/components/layouts.md
@@ -5,7 +5,7 @@ description: Learn how to create reusable layout components for Blazor apps.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/layouts
---
# ASP.NET Core Blazor layouts
diff --git a/aspnetcore/blazor/components/lifecycle.md b/aspnetcore/blazor/components/lifecycle.md
index d992b943709b..566e816c620f 100644
--- a/aspnetcore/blazor/components/lifecycle.md
+++ b/aspnetcore/blazor/components/lifecycle.md
@@ -5,7 +5,7 @@ description: Learn about the ASP.NET Core Razor component lifecycle and how to u
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/22/2024
+ms.date: 11/12/2024
uid: blazor/components/lifecycle
---
# ASP.NET Core Razor component lifecycle
diff --git a/aspnetcore/blazor/components/overwriting-parameters.md b/aspnetcore/blazor/components/overwriting-parameters.md
index c23ffb720d3a..e7b1d834cfdc 100644
--- a/aspnetcore/blazor/components/overwriting-parameters.md
+++ b/aspnetcore/blazor/components/overwriting-parameters.md
@@ -5,7 +5,7 @@ description: Learn how to avoid overwriting parameters in Blazor apps during rer
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 03/08/2024
+ms.date: 11/12/2024
uid: blazor/components/overwriting-parameters
---
# Avoid overwriting parameters in ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/components/prerender.md b/aspnetcore/blazor/components/prerender.md
index bb154215020c..03d1f6f3416b 100644
--- a/aspnetcore/blazor/components/prerender.md
+++ b/aspnetcore/blazor/components/prerender.md
@@ -5,7 +5,7 @@ description: Learn about Razor component prerendering in ASP.NET Core Blazor app
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/22/2024
+ms.date: 11/12/2024
uid: blazor/components/prerender
---
# Prerender ASP.NET Core Razor components
diff --git a/aspnetcore/blazor/components/quickgrid.md b/aspnetcore/blazor/components/quickgrid.md
index 723bb8f5c50f..bee919985700 100644
--- a/aspnetcore/blazor/components/quickgrid.md
+++ b/aspnetcore/blazor/components/quickgrid.md
@@ -5,7 +5,7 @@ description: The QuickGrid component is a Razor component for quickly and effici
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 07/19/2024
+ms.date: 11/12/2024
uid: blazor/components/quickgrid
---
# ASP.NET Core Blazor `QuickGrid` component
diff --git a/aspnetcore/blazor/components/render-components-outside-of-aspnetcore.md b/aspnetcore/blazor/components/render-components-outside-of-aspnetcore.md
index b1217fb8a8d3..1dabf04f60a4 100644
--- a/aspnetcore/blazor/components/render-components-outside-of-aspnetcore.md
+++ b/aspnetcore/blazor/components/render-components-outside-of-aspnetcore.md
@@ -5,7 +5,7 @@ description: Render Razor components outside of the context of an HTTP request.
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/render-outside-of-aspnetcore
---
# Render Razor components outside of ASP.NET Core
diff --git a/aspnetcore/blazor/components/render-modes.md b/aspnetcore/blazor/components/render-modes.md
index e412321ec8f5..6ae9f541080f 100644
--- a/aspnetcore/blazor/components/render-modes.md
+++ b/aspnetcore/blazor/components/render-modes.md
@@ -5,7 +5,7 @@ description: Learn about Blazor render modes and how to apply them in Blazor Web
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 06/10/2024
+ms.date: 11/12/2024
uid: blazor/components/render-modes
---
# ASP.NET Core Blazor render modes
diff --git a/aspnetcore/blazor/components/rendering.md b/aspnetcore/blazor/components/rendering.md
index b3b83a8167dd..e71659691cc9 100644
--- a/aspnetcore/blazor/components/rendering.md
+++ b/aspnetcore/blazor/components/rendering.md
@@ -5,7 +5,7 @@ description: Learn about Razor component rendering in ASP.NET Core Blazor apps,
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/rendering
---
# ASP.NET Core Razor component rendering
diff --git a/aspnetcore/blazor/components/sections.md b/aspnetcore/blazor/components/sections.md
index 5206fbd93666..7283c0cb89c5 100644
--- a/aspnetcore/blazor/components/sections.md
+++ b/aspnetcore/blazor/components/sections.md
@@ -5,7 +5,7 @@ description: Learn how to control the content in a Razor component from a child
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/sections
---
# ASP.NET Core Blazor sections
diff --git a/aspnetcore/blazor/components/splat-attributes-and-arbitrary-parameters.md b/aspnetcore/blazor/components/splat-attributes-and-arbitrary-parameters.md
index 3b3e0d7f97f3..bc1fb77405d8 100644
--- a/aspnetcore/blazor/components/splat-attributes-and-arbitrary-parameters.md
+++ b/aspnetcore/blazor/components/splat-attributes-and-arbitrary-parameters.md
@@ -5,7 +5,7 @@ description: Learn how components can capture and render additional attributes i
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/attribute-splatting
---
# ASP.NET Core Blazor attribute splatting and arbitrary parameters
diff --git a/aspnetcore/blazor/components/synchronization-context.md b/aspnetcore/blazor/components/synchronization-context.md
index 47d769af89a6..d962ae38765d 100644
--- a/aspnetcore/blazor/components/synchronization-context.md
+++ b/aspnetcore/blazor/components/synchronization-context.md
@@ -5,7 +5,7 @@ description: Learn about Blazor's synchronization context, how to avoid thread-b
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/27/2024
+ms.date: 11/12/2024
uid: blazor/components/sync-context
---
# ASP.NET Core Blazor synchronization context
diff --git a/aspnetcore/blazor/components/templated-components.md b/aspnetcore/blazor/components/templated-components.md
index 500831a4a497..54fb84b682cd 100644
--- a/aspnetcore/blazor/components/templated-components.md
+++ b/aspnetcore/blazor/components/templated-components.md
@@ -5,7 +5,7 @@ description: Learn how templated components can accept one or more UI templates
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/components/templated-components
---
# ASP.NET Core Blazor templated components
diff --git a/aspnetcore/blazor/components/virtualization.md b/aspnetcore/blazor/components/virtualization.md
index 033f7dddea4a..9f68e7b6138e 100644
--- a/aspnetcore/blazor/components/virtualization.md
+++ b/aspnetcore/blazor/components/virtualization.md
@@ -5,7 +5,7 @@ description: Learn how to use component virtualization in ASP.NET Core Blazor ap
monikerRange: '>= aspnetcore-5.0'
ms.author: riande
ms.custom: mvc
-ms.date: 07/19/2024
+ms.date: 11/12/2024
uid: blazor/components/virtualization
---
# ASP.NET Core Razor component virtualization
diff --git a/aspnetcore/blazor/debug.md b/aspnetcore/blazor/debug.md
index d013eafab35e..0b4342d22490 100644
--- a/aspnetcore/blazor/debug.md
+++ b/aspnetcore/blazor/debug.md
@@ -5,7 +5,7 @@ description: Learn how to debug Blazor apps, including debugging Blazor WebAssem
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/debug
---
# Debug ASP.NET Core apps
diff --git a/aspnetcore/blazor/file-downloads.md b/aspnetcore/blazor/file-downloads.md
index 1960390a5c27..b0f8ef34f36a 100644
--- a/aspnetcore/blazor/file-downloads.md
+++ b/aspnetcore/blazor/file-downloads.md
@@ -5,7 +5,7 @@ description: Learn how to download files in Blazor apps.
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/file-downloads
---
# ASP.NET Core Blazor file downloads
diff --git a/aspnetcore/blazor/file-uploads.md b/aspnetcore/blazor/file-uploads.md
index c74b0ad0d142..d40a57babd55 100644
--- a/aspnetcore/blazor/file-uploads.md
+++ b/aspnetcore/blazor/file-uploads.md
@@ -5,7 +5,7 @@ description: Learn how to upload files in Blazor with the InputFile component.
monikerRange: '>= aspnetcore-5.0'
ms.author: riande
ms.custom: mvc
-ms.date: 08/29/2024
+ms.date: 11/12/2024
uid: blazor/file-uploads
---
# ASP.NET Core Blazor file uploads
diff --git a/aspnetcore/blazor/forms/binding.md b/aspnetcore/blazor/forms/binding.md
index c902c3fe4324..3065c6627339 100644
--- a/aspnetcore/blazor/forms/binding.md
+++ b/aspnetcore/blazor/forms/binding.md
@@ -5,7 +5,7 @@ description: Learn how to use binding in Blazor forms.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/forms/binding
---
# ASP.NET Core Blazor forms binding
diff --git a/aspnetcore/blazor/forms/index.md b/aspnetcore/blazor/forms/index.md
index 707b364c2455..99c8268a295a 100644
--- a/aspnetcore/blazor/forms/index.md
+++ b/aspnetcore/blazor/forms/index.md
@@ -5,7 +5,7 @@ description: Learn how to use forms in Blazor.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/forms/index
---
# ASP.NET Core Blazor forms overview
diff --git a/aspnetcore/blazor/forms/input-components.md b/aspnetcore/blazor/forms/input-components.md
index 0e596c218988..abfbeb679531 100644
--- a/aspnetcore/blazor/forms/input-components.md
+++ b/aspnetcore/blazor/forms/input-components.md
@@ -5,7 +5,7 @@ description: Learn about built-in Blazor input components.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/forms/input-components
---
# ASP.NET Core Blazor input components
diff --git a/aspnetcore/blazor/forms/troubleshoot.md b/aspnetcore/blazor/forms/troubleshoot.md
index bcf6c51f0858..75dd36782fbf 100644
--- a/aspnetcore/blazor/forms/troubleshoot.md
+++ b/aspnetcore/blazor/forms/troubleshoot.md
@@ -5,7 +5,7 @@ description: Learn how to troubleshoot forms in Blazor.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/forms/troubleshoot
---
# Troubleshoot ASP.NET Core Blazor forms
diff --git a/aspnetcore/blazor/forms/validation.md b/aspnetcore/blazor/forms/validation.md
index b74887a9c694..c8edd578a5cd 100644
--- a/aspnetcore/blazor/forms/validation.md
+++ b/aspnetcore/blazor/forms/validation.md
@@ -5,7 +5,7 @@ description: Learn how to use validation in Blazor forms.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/forms/validation
---
# ASP.NET Core Blazor forms validation
diff --git a/aspnetcore/blazor/fundamentals/configuration.md b/aspnetcore/blazor/fundamentals/configuration.md
index 204a3d1d3d54..83aa25d22d2b 100644
--- a/aspnetcore/blazor/fundamentals/configuration.md
+++ b/aspnetcore/blazor/fundamentals/configuration.md
@@ -5,7 +5,7 @@ description: Learn about Blazor app configuration, including app settings, authe
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/fundamentals/configuration
---
# ASP.NET Core Blazor configuration
diff --git a/aspnetcore/blazor/fundamentals/dependency-injection.md b/aspnetcore/blazor/fundamentals/dependency-injection.md
index 9b516cb448ec..0af6dc833731 100644
--- a/aspnetcore/blazor/fundamentals/dependency-injection.md
+++ b/aspnetcore/blazor/fundamentals/dependency-injection.md
@@ -5,7 +5,7 @@ description: Learn how Blazor apps can inject services into components.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 05/03/2024
+ms.date: 11/12/2024
uid: blazor/fundamentals/dependency-injection
---
# ASP.NET Core Blazor dependency injection
diff --git a/aspnetcore/blazor/fundamentals/environments.md b/aspnetcore/blazor/fundamentals/environments.md
index c9e2b23f433f..e62c9bdf693c 100644
--- a/aspnetcore/blazor/fundamentals/environments.md
+++ b/aspnetcore/blazor/fundamentals/environments.md
@@ -5,7 +5,7 @@ description: Learn about environments in Blazor, including how to set the enviro
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/fundamentals/environments
---
# ASP.NET Core Blazor environments
diff --git a/aspnetcore/blazor/fundamentals/handle-errors.md b/aspnetcore/blazor/fundamentals/handle-errors.md
index 4a8701b262c4..436b1dac5369 100644
--- a/aspnetcore/blazor/fundamentals/handle-errors.md
+++ b/aspnetcore/blazor/fundamentals/handle-errors.md
@@ -5,7 +5,7 @@ description: Discover how ASP.NET Core Blazor manages unhandled exceptions and h
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/16/2024
+ms.date: 11/12/2024
uid: blazor/fundamentals/handle-errors
---
# Handle errors in ASP.NET Core Blazor apps
diff --git a/aspnetcore/blazor/fundamentals/index.md b/aspnetcore/blazor/fundamentals/index.md
index 12bc63c6c5fd..a84a5333cac0 100644
--- a/aspnetcore/blazor/fundamentals/index.md
+++ b/aspnetcore/blazor/fundamentals/index.md
@@ -5,7 +5,7 @@ description: Learn foundational concepts of the Blazor application framework.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/fundamentals/index
---
# ASP.NET Core Blazor fundamentals
diff --git a/aspnetcore/blazor/fundamentals/logging.md b/aspnetcore/blazor/fundamentals/logging.md
index 5b6935fa45bb..2f76cb2c93b3 100644
--- a/aspnetcore/blazor/fundamentals/logging.md
+++ b/aspnetcore/blazor/fundamentals/logging.md
@@ -5,7 +5,7 @@ description: Learn about Blazor app logging, including configuration and how to
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/fundamentals/logging
---
# ASP.NET Core Blazor logging
diff --git a/aspnetcore/blazor/fundamentals/routing.md b/aspnetcore/blazor/fundamentals/routing.md
index 2743d86a34c6..26d06edf228a 100644
--- a/aspnetcore/blazor/fundamentals/routing.md
+++ b/aspnetcore/blazor/fundamentals/routing.md
@@ -5,7 +5,7 @@ description: Learn how to manage Blazor app request routing and how to use the N
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/fundamentals/routing
---
# ASP.NET Core Blazor routing and navigation
diff --git a/aspnetcore/blazor/fundamentals/signalr.md b/aspnetcore/blazor/fundamentals/signalr.md
index ce99003507aa..ad02ffa840eb 100644
--- a/aspnetcore/blazor/fundamentals/signalr.md
+++ b/aspnetcore/blazor/fundamentals/signalr.md
@@ -5,7 +5,7 @@ description: Learn how to configure and manage Blazor SignalR connections.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/fundamentals/signalr
---
# ASP.NET Core Blazor SignalR guidance
diff --git a/aspnetcore/blazor/fundamentals/startup.md b/aspnetcore/blazor/fundamentals/startup.md
index a507e882c2a6..99ba9ade81fb 100644
--- a/aspnetcore/blazor/fundamentals/startup.md
+++ b/aspnetcore/blazor/fundamentals/startup.md
@@ -5,7 +5,7 @@ description: Learn how to configure Blazor startup.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/fundamentals/startup
---
# ASP.NET Core Blazor startup
diff --git a/aspnetcore/blazor/fundamentals/static-files.md b/aspnetcore/blazor/fundamentals/static-files.md
index aa581810b04d..e88b09a3d562 100644
--- a/aspnetcore/blazor/fundamentals/static-files.md
+++ b/aspnetcore/blazor/fundamentals/static-files.md
@@ -5,7 +5,7 @@ description: Learn how to configure and manage static files for Blazor apps.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 07/08/2024
+ms.date: 11/12/2024
uid: blazor/fundamentals/static-files
---
# ASP.NET Core Blazor static files
diff --git a/aspnetcore/blazor/globalization-localization.md b/aspnetcore/blazor/globalization-localization.md
index 1f49331cf5f5..50c3e0cb063a 100644
--- a/aspnetcore/blazor/globalization-localization.md
+++ b/aspnetcore/blazor/globalization-localization.md
@@ -5,7 +5,7 @@ description: Learn how to render globalized and localized content to users in di
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/globalization-localization
---
# ASP.NET Core Blazor globalization and localization
diff --git a/aspnetcore/blazor/host-and-deploy/configure-linker.md b/aspnetcore/blazor/host-and-deploy/configure-linker.md
index 9c195c012116..f0834255a584 100644
--- a/aspnetcore/blazor/host-and-deploy/configure-linker.md
+++ b/aspnetcore/blazor/host-and-deploy/configure-linker.md
@@ -5,7 +5,7 @@ description: Learn how to control the Intermediate Language (IL) Linker when bui
monikerRange: '= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/host-and-deploy/configure-linker
---
# Configure the Linker for ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/host-and-deploy/configure-trimmer.md b/aspnetcore/blazor/host-and-deploy/configure-trimmer.md
index f19193ebacaf..98018ec7aee8 100644
--- a/aspnetcore/blazor/host-and-deploy/configure-trimmer.md
+++ b/aspnetcore/blazor/host-and-deploy/configure-trimmer.md
@@ -5,7 +5,7 @@ description: Learn how to control the Intermediate Language (IL) Trimmer when bu
monikerRange: '>= aspnetcore-5.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/host-and-deploy/configure-trimmer
---
# Configure the Trimmer for ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/host-and-deploy/index.md b/aspnetcore/blazor/host-and-deploy/index.md
index 0ebd0c7d0b04..8b784bf8b4a4 100644
--- a/aspnetcore/blazor/host-and-deploy/index.md
+++ b/aspnetcore/blazor/host-and-deploy/index.md
@@ -5,7 +5,7 @@ description: Discover how to host and deploy Blazor apps.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/host-and-deploy/index
---
# Host and deploy ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/host-and-deploy/multiple-hosted-webassembly.md b/aspnetcore/blazor/host-and-deploy/multiple-hosted-webassembly.md
index 29fd719339eb..da45725523ba 100644
--- a/aspnetcore/blazor/host-and-deploy/multiple-hosted-webassembly.md
+++ b/aspnetcore/blazor/host-and-deploy/multiple-hosted-webassembly.md
@@ -5,7 +5,7 @@ description: Learn how to configure a hosted Blazor WebAssembly app to host mult
monikerRange: '>= aspnetcore-3.1 < aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/host-and-deploy/multiple-hosted-webassembly
zone_pivot_groups: blazor-multiple-hosted-wasm-apps
---
@@ -66,7 +66,7 @@ The preceding configurations are beyond the scope of this article. For more info
* [Host and deploy articles](xref:host-and-deploy/index)
*
-*
+*
Use an existing hosted Blazor WebAssembly [solution](xref:blazor/tooling#visual-studio-solution-file-sln) or create a [new hosted Blazor WebAssembly solution](xref:blazor/tooling) from the Blazor WebAssembly project template by passing the `-ho|--hosted` option if using the .NET CLI or selecting the **ASP.NET Core Hosted** checkbox in Visual Studio when the project is created in the IDE.
@@ -453,7 +453,7 @@ public class HomeController : Controller
> [!NOTE]
> The preceding `Index` view is a minimal example purely for demonstration purposes. If the app requires additional MVC assets, such as a layout, styles, scripts, and imports, obtain them from an app created from the MVC project template. For more information, see .
-For more information on using the Razor components from either of the client apps in pages or views of the server app, see .
+For more information on using the Razor components from either of the client apps in pages or views of the server app, see .
## Run the app
diff --git a/aspnetcore/blazor/host-and-deploy/server.md b/aspnetcore/blazor/host-and-deploy/server.md
index 27e9edd25fba..87b1c861bbe5 100644
--- a/aspnetcore/blazor/host-and-deploy/server.md
+++ b/aspnetcore/blazor/host-and-deploy/server.md
@@ -5,7 +5,7 @@ description: Learn how to host and deploy server-side Blazor apps using ASP.NET
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc, linux-related-content
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/host-and-deploy/server
---
# Host and deploy server-side Blazor apps
diff --git a/aspnetcore/blazor/host-and-deploy/webassembly-caching/http-caching-issues.md b/aspnetcore/blazor/host-and-deploy/webassembly-caching/http-caching-issues.md
index d61c819a601c..27ab69fec5c9 100644
--- a/aspnetcore/blazor/host-and-deploy/webassembly-caching/http-caching-issues.md
+++ b/aspnetcore/blazor/host-and-deploy/webassembly-caching/http-caching-issues.md
@@ -5,7 +5,7 @@ description: Learn how to avoid HTTP caching issues when upgrading Blazor apps.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/host-and-deploy/webassembly-caching/http-caching-issues
---
# Avoid HTTP caching issues when upgrading ASP.NET Core Blazor apps
diff --git a/aspnetcore/blazor/host-and-deploy/webassembly-caching/index.md b/aspnetcore/blazor/host-and-deploy/webassembly-caching/index.md
index ba97dc8f540a..7238f0f758b9 100644
--- a/aspnetcore/blazor/host-and-deploy/webassembly-caching/index.md
+++ b/aspnetcore/blazor/host-and-deploy/webassembly-caching/index.md
@@ -5,7 +5,7 @@ description: Learn how to Blazor WebAssembly caches the WebAssembly .NET runtime
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 03/28/2024
+ms.date: 11/12/2024
uid: blazor/host-and-deploy/webassembly-caching/index
---
# ASP.NET Core Blazor WebAssembly .NET runtime and app bundle caching
diff --git a/aspnetcore/blazor/host-and-deploy/webassembly-deployment-layout.md b/aspnetcore/blazor/host-and-deploy/webassembly-deployment-layout.md
index 1e5349a681e5..118844004690 100644
--- a/aspnetcore/blazor/host-and-deploy/webassembly-deployment-layout.md
+++ b/aspnetcore/blazor/host-and-deploy/webassembly-deployment-layout.md
@@ -5,7 +5,7 @@ description: Learn how to enable hosted Blazor WebAssembly deployments in enviro
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/host-and-deploy/webassembly-deployment-layout
---
# Deployment layout for ASP.NET Core hosted Blazor WebAssembly apps
diff --git a/aspnetcore/blazor/host-and-deploy/webassembly.md b/aspnetcore/blazor/host-and-deploy/webassembly.md
index 0cf678f9eb01..cac1018d8571 100644
--- a/aspnetcore/blazor/host-and-deploy/webassembly.md
+++ b/aspnetcore/blazor/host-and-deploy/webassembly.md
@@ -5,7 +5,7 @@ description: Learn how to host and deploy Blazor WebAssembly using ASP.NET Core,
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc, linux-related-content
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/host-and-deploy/webassembly
---
# Host and deploy ASP.NET Core Blazor WebAssembly
diff --git a/aspnetcore/blazor/hosting-models.md b/aspnetcore/blazor/hosting-models.md
index c984d209acc0..e60b784d3bac 100644
--- a/aspnetcore/blazor/hosting-models.md
+++ b/aspnetcore/blazor/hosting-models.md
@@ -5,7 +5,7 @@ description: Learn about Blazor hosting models and how to pick which one to use.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hosting-models
---
# ASP.NET Core Blazor hosting models
diff --git a/aspnetcore/blazor/hybrid/class-libraries.md b/aspnetcore/blazor/hybrid/class-libraries.md
index 8baad8d0759e..fb08e780b616 100644
--- a/aspnetcore/blazor/hybrid/class-libraries.md
+++ b/aspnetcore/blazor/hybrid/class-libraries.md
@@ -5,7 +5,7 @@ description: Learn how to share Razor components, C# code, and static assets acr
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/class-libraries
---
# Share assets across web and native clients using a Razor class library (RCL)
diff --git a/aspnetcore/blazor/hybrid/developer-tools.md b/aspnetcore/blazor/hybrid/developer-tools.md
index 7c48b6d28f0d..d380145e4364 100644
--- a/aspnetcore/blazor/hybrid/developer-tools.md
+++ b/aspnetcore/blazor/hybrid/developer-tools.md
@@ -5,7 +5,7 @@ description: Learn how to use browser developer tools with ASP.NET Core Blazor H
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: "mvc"
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/developer-tools
zone_pivot_groups: blazor-hybrid-operating-systems
---
diff --git a/aspnetcore/blazor/hybrid/index.md b/aspnetcore/blazor/hybrid/index.md
index 5bb3c69fa21f..5c2891312a8c 100644
--- a/aspnetcore/blazor/hybrid/index.md
+++ b/aspnetcore/blazor/hybrid/index.md
@@ -5,7 +5,7 @@ description: Explore ASP.NET Core Blazor Hybrid, a way to build interactive clie
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: "mvc"
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/index
---
# ASP.NET Core Blazor Hybrid
diff --git a/aspnetcore/blazor/hybrid/publish/index.md b/aspnetcore/blazor/hybrid/publish/index.md
index 8ca1186d2280..b84cb6ade9df 100644
--- a/aspnetcore/blazor/hybrid/publish/index.md
+++ b/aspnetcore/blazor/hybrid/publish/index.md
@@ -5,7 +5,7 @@ description: Learn about publishing ASP.NET Core Blazor Hybrid apps.
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: "mvc"
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/publish/index
---
# Publish ASP.NET Core Blazor Hybrid apps
diff --git a/aspnetcore/blazor/hybrid/reuse-razor-components.md b/aspnetcore/blazor/hybrid/reuse-razor-components.md
index 39e81eaf459a..82634f78fa05 100644
--- a/aspnetcore/blazor/hybrid/reuse-razor-components.md
+++ b/aspnetcore/blazor/hybrid/reuse-razor-components.md
@@ -5,7 +5,7 @@ description: Learn how to author and organize Razor components for the web and W
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: "mvc"
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/reuse-razor-components
---
# Reuse Razor components in ASP.NET Core Blazor Hybrid
diff --git a/aspnetcore/blazor/hybrid/root-component-parameters.md b/aspnetcore/blazor/hybrid/root-component-parameters.md
index fa25c61bbec8..9c6099e53d38 100644
--- a/aspnetcore/blazor/hybrid/root-component-parameters.md
+++ b/aspnetcore/blazor/hybrid/root-component-parameters.md
@@ -5,7 +5,7 @@ description: Learn how to pass an optional dictionary of parameters to the root
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: "mvc"
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/root-component-parameters
---
# Pass root component parameters in ASP.NET Core Blazor Hybrid
diff --git a/aspnetcore/blazor/hybrid/routing.md b/aspnetcore/blazor/hybrid/routing.md
index 89366c6fd712..ed894028521b 100644
--- a/aspnetcore/blazor/hybrid/routing.md
+++ b/aspnetcore/blazor/hybrid/routing.md
@@ -5,7 +5,7 @@ description: Learn how to manage request routing and navigation in Blazor Hybrid
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: "mvc"
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/routing
zone_pivot_groups: blazor-hybrid-frameworks
---
diff --git a/aspnetcore/blazor/hybrid/security/index.md b/aspnetcore/blazor/hybrid/security/index.md
index 8da3c91e442c..925ee1ce00be 100644
--- a/aspnetcore/blazor/hybrid/security/index.md
+++ b/aspnetcore/blazor/hybrid/security/index.md
@@ -5,7 +5,7 @@ description: Learn about Blazor Hybrid authentication and authorization scenario
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/security/index
zone_pivot_groups: blazor-hybrid-frameworks
---
diff --git a/aspnetcore/blazor/hybrid/security/security-considerations.md b/aspnetcore/blazor/hybrid/security/security-considerations.md
index 807561f8e986..ed7c191ce6f9 100644
--- a/aspnetcore/blazor/hybrid/security/security-considerations.md
+++ b/aspnetcore/blazor/hybrid/security/security-considerations.md
@@ -5,7 +5,7 @@ description: Learn about security considerations when developing apps in Blazor
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/security/security-considerations
---
# ASP.NET Core Blazor Hybrid security considerations
diff --git a/aspnetcore/blazor/hybrid/static-files.md b/aspnetcore/blazor/hybrid/static-files.md
index 85d998639ba5..7656256f0e7f 100644
--- a/aspnetcore/blazor/hybrid/static-files.md
+++ b/aspnetcore/blazor/hybrid/static-files.md
@@ -5,7 +5,7 @@ description: Learn how to consume static asset files in Blazor Hybrid apps.
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/static-files
---
# ASP.NET Core Blazor Hybrid static files
diff --git a/aspnetcore/blazor/hybrid/troubleshoot.md b/aspnetcore/blazor/hybrid/troubleshoot.md
index 85de7a18f5c0..88403a852790 100644
--- a/aspnetcore/blazor/hybrid/troubleshoot.md
+++ b/aspnetcore/blazor/hybrid/troubleshoot.md
@@ -5,7 +5,7 @@ description: Learn how to troubleshoot issues in ASP.NET Core Blazor Hybrid with
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: "mvc"
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/troubleshoot
---
# Troubleshoot ASP.NET Core Blazor Hybrid
diff --git a/aspnetcore/blazor/hybrid/tutorials/index.md b/aspnetcore/blazor/hybrid/tutorials/index.md
index f16901fb7172..7d9bf7fa85ce 100644
--- a/aspnetcore/blazor/hybrid/tutorials/index.md
+++ b/aspnetcore/blazor/hybrid/tutorials/index.md
@@ -5,7 +5,7 @@ description: Learn how to build Blazor Hybrid apps with the tutorials listed in
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/tutorials/index
---
# ASP.NET Core Blazor Hybrid tutorials
diff --git a/aspnetcore/blazor/hybrid/tutorials/maui-blazor-web-app.md b/aspnetcore/blazor/hybrid/tutorials/maui-blazor-web-app.md
index d27cbd51beba..88855e066f86 100644
--- a/aspnetcore/blazor/hybrid/tutorials/maui-blazor-web-app.md
+++ b/aspnetcore/blazor/hybrid/tutorials/maui-blazor-web-app.md
@@ -5,7 +5,7 @@ description: Learn how to build a .NET MAUI Blazor Hybrid app with a Blazor Web
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 10/17/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/tutorials/maui-blazor-web-app
---
# Build a .NET MAUI Blazor Hybrid app with a Blazor Web App
diff --git a/aspnetcore/blazor/hybrid/tutorials/maui.md b/aspnetcore/blazor/hybrid/tutorials/maui.md
index 9367a84935ce..b40b7445787d 100644
--- a/aspnetcore/blazor/hybrid/tutorials/maui.md
+++ b/aspnetcore/blazor/hybrid/tutorials/maui.md
@@ -5,7 +5,7 @@ description: Build a .NET MAUI Blazor Hybrid app step-by-step.
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/tutorials/maui
---
# Build a .NET MAUI Blazor Hybrid app
diff --git a/aspnetcore/blazor/hybrid/tutorials/windows-forms.md b/aspnetcore/blazor/hybrid/tutorials/windows-forms.md
index def59116fc09..5967275c9aa7 100644
--- a/aspnetcore/blazor/hybrid/tutorials/windows-forms.md
+++ b/aspnetcore/blazor/hybrid/tutorials/windows-forms.md
@@ -5,7 +5,7 @@ description: Build a Windows Forms Blazor app step-by-step.
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/tutorials/windows-forms
---
# Build a Windows Forms Blazor app
diff --git a/aspnetcore/blazor/hybrid/tutorials/wpf.md b/aspnetcore/blazor/hybrid/tutorials/wpf.md
index 7eb7e390aba4..cc7781a44ae6 100644
--- a/aspnetcore/blazor/hybrid/tutorials/wpf.md
+++ b/aspnetcore/blazor/hybrid/tutorials/wpf.md
@@ -5,7 +5,7 @@ description: Build a Windows Presentation Foundation (WPF) app step-by-step.
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/hybrid/tutorials/wpf
---
# Build a Windows Presentation Foundation (WPF) Blazor app
diff --git a/aspnetcore/blazor/images-and-documents.md b/aspnetcore/blazor/images-and-documents.md
index 1b35fe0e1b3b..61ed1f0c27e7 100644
--- a/aspnetcore/blazor/images-and-documents.md
+++ b/aspnetcore/blazor/images-and-documents.md
@@ -5,7 +5,7 @@ description: Learn how to display images and documents in ASP.NET Core Blazor ap
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 08/13/2024
+ms.date: 11/12/2024
uid: blazor/images-and-documents
---
# Display images and documents in ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/index.md b/aspnetcore/blazor/index.md
index 0831f25e72fb..eb9cf88c497a 100644
--- a/aspnetcore/blazor/index.md
+++ b/aspnetcore/blazor/index.md
@@ -5,7 +5,7 @@ description: Explore ASP.NET Core Blazor, a way to build interactive client-side
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: "mvc"
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/index
---
# ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/javascript-interoperability/call-dotnet-from-javascript.md b/aspnetcore/blazor/javascript-interoperability/call-dotnet-from-javascript.md
index 28ceb8692a06..1a228b4003d0 100644
--- a/aspnetcore/blazor/javascript-interoperability/call-dotnet-from-javascript.md
+++ b/aspnetcore/blazor/javascript-interoperability/call-dotnet-from-javascript.md
@@ -5,7 +5,7 @@ description: Learn how to invoke .NET methods from JavaScript functions in Blazo
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/js-interop/call-dotnet-from-javascript
---
# Call .NET methods from JavaScript functions in ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/javascript-interoperability/import-export-interop.md b/aspnetcore/blazor/javascript-interoperability/import-export-interop.md
index 28661d72b38c..13f78ef51053 100644
--- a/aspnetcore/blazor/javascript-interoperability/import-export-interop.md
+++ b/aspnetcore/blazor/javascript-interoperability/import-export-interop.md
@@ -5,7 +5,7 @@ description: Learn how to interact with JavaScript in client-side components usi
monikerRange: '>= aspnetcore-7.0'
ms.author: riande
ms.custom: mvc
-ms.date: 07/25/2024
+ms.date: 11/12/2024
uid: blazor/js-interop/import-export-interop
---
# JavaScript `[JSImport]`/`[JSExport]` interop with ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/javascript-interoperability/index.md b/aspnetcore/blazor/javascript-interoperability/index.md
index 227ef62bf586..6c94afbced8c 100644
--- a/aspnetcore/blazor/javascript-interoperability/index.md
+++ b/aspnetcore/blazor/javascript-interoperability/index.md
@@ -5,7 +5,7 @@ description: Learn how to interact with JavaScript in Blazor apps.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/js-interop/index
---
# ASP.NET Core Blazor JavaScript interoperability (JS interop)
diff --git a/aspnetcore/blazor/javascript-interoperability/location-of-javascript.md b/aspnetcore/blazor/javascript-interoperability/location-of-javascript.md
index 48e0fea97ba7..8c8802ca8596 100644
--- a/aspnetcore/blazor/javascript-interoperability/location-of-javascript.md
+++ b/aspnetcore/blazor/javascript-interoperability/location-of-javascript.md
@@ -5,7 +5,7 @@ description: Learn where to place and how to load JavaScript in Blazor apps.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 10/03/2024
+ms.date: 11/12/2024
uid: blazor/js-interop/javascript-location
---
# JavaScript location in ASP.NET Core Blazor apps
diff --git a/aspnetcore/blazor/javascript-interoperability/static-server-rendering.md b/aspnetcore/blazor/javascript-interoperability/static-server-rendering.md
index 9213318c4a28..7db454ab0b13 100644
--- a/aspnetcore/blazor/javascript-interoperability/static-server-rendering.md
+++ b/aspnetcore/blazor/javascript-interoperability/static-server-rendering.md
@@ -5,7 +5,7 @@ description: Learn how to use JavaScript in a Blazor Web App with static server-
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/js-interop/ssr
---
# ASP.NET Core Blazor JavaScript with static server-side rendering (static SSR)
diff --git a/aspnetcore/blazor/performance.md b/aspnetcore/blazor/performance.md
index 06604ea95db4..71661280723f 100644
--- a/aspnetcore/blazor/performance.md
+++ b/aspnetcore/blazor/performance.md
@@ -5,7 +5,7 @@ description: Tips for increasing performance in ASP.NET Core Blazor apps and avo
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/performance
---
# ASP.NET Core Blazor performance best practices
diff --git a/aspnetcore/blazor/progressive-web-app.md b/aspnetcore/blazor/progressive-web-app.md
index 3cb51d38427b..ba74005514df 100644
--- a/aspnetcore/blazor/progressive-web-app.md
+++ b/aspnetcore/blazor/progressive-web-app.md
@@ -5,7 +5,7 @@ description: Learn how to build a Blazor Progressive Web Application (PWA) that
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/progressive-web-app
---
# ASP.NET Core Blazor Progressive Web Application (PWA)
diff --git a/aspnetcore/blazor/project-structure.md b/aspnetcore/blazor/project-structure.md
index 7d384e5857ca..da1602300b44 100644
--- a/aspnetcore/blazor/project-structure.md
+++ b/aspnetcore/blazor/project-structure.md
@@ -5,7 +5,7 @@ description: Learn about ASP.NET Core Blazor app project structure.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/project-structure
---
# ASP.NET Core Blazor project structure
diff --git a/aspnetcore/blazor/security/authentication-state.md b/aspnetcore/blazor/security/authentication-state.md
index df60b31b2406..81aba37479d9 100644
--- a/aspnetcore/blazor/security/authentication-state.md
+++ b/aspnetcore/blazor/security/authentication-state.md
@@ -5,7 +5,7 @@ description: Learn how to create a custom authentication state provider and rece
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 09/23/2024
+ms.date: 11/12/2024
uid: blazor/security/authentication-state
zone_pivot_groups: blazor-app-models
---
diff --git a/aspnetcore/blazor/security/blazor-web-app-with-entra.md b/aspnetcore/blazor/security/blazor-web-app-with-entra.md
index c96cba6ffabc..c7530cd04e8a 100644
--- a/aspnetcore/blazor/security/blazor-web-app-with-entra.md
+++ b/aspnetcore/blazor/security/blazor-web-app-with-entra.md
@@ -5,7 +5,7 @@ description: Learn how to secure a Blazor WebAssembly App with Microsoft Entra I
monikerRange: '>= aspnetcore-9.0'
ms.author: riande
ms.custom: mvc
-ms.date: 10/07/2024
+ms.date: 11/12/2024
uid: blazor/security/blazor-web-app-entra
---
# Secure an ASP.NET Core Blazor Web App with Microsoft Entra ID
diff --git a/aspnetcore/blazor/security/blazor-web-app-with-oidc.md b/aspnetcore/blazor/security/blazor-web-app-with-oidc.md
index 9234319c0240..ba587665a17b 100644
--- a/aspnetcore/blazor/security/blazor-web-app-with-oidc.md
+++ b/aspnetcore/blazor/security/blazor-web-app-with-oidc.md
@@ -5,7 +5,7 @@ description: Learn how to secure a Blazor WebAssembly App with OpenID Connect (O
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 10/09/2024
+ms.date: 11/12/2024
uid: blazor/security/blazor-web-app-oidc
zone_pivot_groups: blazor-web-app-oidc-specification
---
diff --git a/aspnetcore/blazor/security/content-security-policy.md b/aspnetcore/blazor/security/content-security-policy.md
index 698cdd35e22d..422b63e46fac 100644
--- a/aspnetcore/blazor/security/content-security-policy.md
+++ b/aspnetcore/blazor/security/content-security-policy.md
@@ -5,7 +5,7 @@ description: Learn how to use a Content Security Policy (CSP) with ASP.NET Core
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/security/content-security-policy
---
# Enforce a Content Security Policy for ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/security/index.md b/aspnetcore/blazor/security/index.md
index bd6c3be32b6a..f57dd42706ea 100644
--- a/aspnetcore/blazor/security/index.md
+++ b/aspnetcore/blazor/security/index.md
@@ -5,7 +5,7 @@ description: Learn about Blazor authentication and authorization scenarios.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/security/index
---
# ASP.NET Core Blazor authentication and authorization
diff --git a/aspnetcore/blazor/security/server/account-confirmation-and-password-recovery.md b/aspnetcore/blazor/security/server/account-confirmation-and-password-recovery.md
index 00b5301384d7..d6284841360b 100644
--- a/aspnetcore/blazor/security/server/account-confirmation-and-password-recovery.md
+++ b/aspnetcore/blazor/security/server/account-confirmation-and-password-recovery.md
@@ -4,7 +4,7 @@ author: guardrex
description: Learn how to configure an ASP.NET Core Blazor Web App with email confirmation and password recovery.
ms.author: riande
monikerRange: '>= aspnetcore-8.0'
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/security/server/account-confirmation-and-password-recovery
---
# Account confirmation and password recovery in ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/security/server/additional-scenarios.md b/aspnetcore/blazor/security/server/additional-scenarios.md
index 4f13da077cc6..631a500e0a39 100644
--- a/aspnetcore/blazor/security/server/additional-scenarios.md
+++ b/aspnetcore/blazor/security/server/additional-scenarios.md
@@ -5,7 +5,7 @@ description: Learn how to configure server-side Blazor for additional security s
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/security/server/additional-scenarios
---
# Server-side ASP.NET Core Blazor additional security scenarios
diff --git a/aspnetcore/blazor/security/server/index.md b/aspnetcore/blazor/security/server/index.md
index fba2662fbf0a..83f32d7800f1 100644
--- a/aspnetcore/blazor/security/server/index.md
+++ b/aspnetcore/blazor/security/server/index.md
@@ -5,7 +5,7 @@ description: Learn how to secure server-side Blazor apps as ASP.NET Core applica
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 06/10/2024
+ms.date: 11/12/2024
uid: blazor/security/server/index
---
# Secure ASP.NET Core server-side Blazor apps
diff --git a/aspnetcore/blazor/security/server/interactive-server-side-rendering.md b/aspnetcore/blazor/security/server/interactive-server-side-rendering.md
index 3c214cd3aff1..e0596753dccb 100644
--- a/aspnetcore/blazor/security/server/interactive-server-side-rendering.md
+++ b/aspnetcore/blazor/security/server/interactive-server-side-rendering.md
@@ -5,7 +5,7 @@ description: Learn how to mitigate security threats in interactive server-side B
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/security/server/interactive-server-side-rendering
---
# Threat mitigation guidance for ASP.NET Core Blazor interactive server-side rendering
diff --git a/aspnetcore/blazor/security/server/qrcodes-for-authenticator-apps.md b/aspnetcore/blazor/security/server/qrcodes-for-authenticator-apps.md
index 33b495535c71..8203df16042b 100644
--- a/aspnetcore/blazor/security/server/qrcodes-for-authenticator-apps.md
+++ b/aspnetcore/blazor/security/server/qrcodes-for-authenticator-apps.md
@@ -4,7 +4,7 @@ author: guardrex
description: Discover how to enable QR code generation for TOTP authenticator apps that work with ASP.NET Core Blazor Web App two-factor authentication.
ms.author: riande
monikerRange: '>= aspnetcore-8.0'
-ms.date: 04/01/2024
+ms.date: 11/12/2024
uid: blazor/security/server/qrcodes-for-authenticator-apps
---
# Enable QR code generation for TOTP authenticator apps in an ASP.NET Core Blazor Web App
diff --git a/aspnetcore/blazor/security/server/static-server-side-rendering.md b/aspnetcore/blazor/security/server/static-server-side-rendering.md
index 5425a21a4841..bf4d33f7b914 100644
--- a/aspnetcore/blazor/security/server/static-server-side-rendering.md
+++ b/aspnetcore/blazor/security/server/static-server-side-rendering.md
@@ -5,7 +5,7 @@ description: Learn how to mitigate security threats in static server-side Blazor
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/security/server/static-server-side-rendering
---
# Threat mitigation guidance for ASP.NET Core Blazor static server-side rendering
diff --git a/aspnetcore/blazor/security/webassembly/additional-scenarios.md b/aspnetcore/blazor/security/webassembly/additional-scenarios.md
index 9b3c325a6d0f..33a22039fbf3 100644
--- a/aspnetcore/blazor/security/webassembly/additional-scenarios.md
+++ b/aspnetcore/blazor/security/webassembly/additional-scenarios.md
@@ -5,7 +5,7 @@ description: Learn how to configure Blazor WebAssembly for additional security s
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/additional-scenarios
---
# ASP.NET Core Blazor WebAssembly additional security scenarios
@@ -1283,7 +1283,7 @@ To configure a Blazor WebAssembly app to use the [ASP.NET Core gRPC framework](x
:::moniker range="< aspnetcore-8.0"
> [!NOTE]
-> Prerendering is enabled by default in hosted Blazor WebAssembly apps, so you must account for the component rendering first from the server and then from the client. Any prerendered state should flow to the client so that it can be reused. For more information, see .
+> Prerendering is enabled by default in hosted Blazor WebAssembly apps, so you must account for the component rendering first from the server and then from the client. Any prerendered state should flow to the client so that it can be reused. For more information, see .
:::moniker-end
diff --git a/aspnetcore/blazor/security/webassembly/graph-api.md b/aspnetcore/blazor/security/webassembly/graph-api.md
index 59ba5386140e..e459e90051f7 100644
--- a/aspnetcore/blazor/security/webassembly/graph-api.md
+++ b/aspnetcore/blazor/security/webassembly/graph-api.md
@@ -5,7 +5,7 @@ description: Learn how to use the Microsoft Graph SDK/API with Blazor WebAssembl
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 09/09/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/graph-api
zone_pivot_groups: blazor-graph-api
---
diff --git a/aspnetcore/blazor/security/webassembly/hosted-with-azure-active-directory-b2c.md b/aspnetcore/blazor/security/webassembly/hosted-with-azure-active-directory-b2c.md
index e3ca1104ce14..cd063ef8c4a3 100644
--- a/aspnetcore/blazor/security/webassembly/hosted-with-azure-active-directory-b2c.md
+++ b/aspnetcore/blazor/security/webassembly/hosted-with-azure-active-directory-b2c.md
@@ -5,7 +5,7 @@ description: Learn how to secure a hosted ASP.NET Core Blazor WebAssembly app wi
monikerRange: '>= aspnetcore-3.1 < aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 06/07/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/hosted-with-azure-active-directory-b2c
---
# Secure a hosted ASP.NET Core Blazor WebAssembly app with Azure Active Directory B2C
diff --git a/aspnetcore/blazor/security/webassembly/hosted-with-identity-server.md b/aspnetcore/blazor/security/webassembly/hosted-with-identity-server.md
index dfda545a866e..0af26a2d587b 100644
--- a/aspnetcore/blazor/security/webassembly/hosted-with-identity-server.md
+++ b/aspnetcore/blazor/security/webassembly/hosted-with-identity-server.md
@@ -5,7 +5,7 @@ description: Learn how to secure a hosted ASP.NET Core Blazor WebAssembly app wi
monikerRange: '>= aspnetcore-3.1 < aspnetcore-8.0'
ms.author: riande
ms.custom: mvc, linux-related-content
-ms.date: 06/07/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/hosted-with-identity-server
---
# Secure a hosted ASP.NET Core Blazor WebAssembly app with Identity Server
diff --git a/aspnetcore/blazor/security/webassembly/hosted-with-microsoft-entra-id.md b/aspnetcore/blazor/security/webassembly/hosted-with-microsoft-entra-id.md
index efa05e4b3214..64d7cf1efdb4 100644
--- a/aspnetcore/blazor/security/webassembly/hosted-with-microsoft-entra-id.md
+++ b/aspnetcore/blazor/security/webassembly/hosted-with-microsoft-entra-id.md
@@ -5,7 +5,7 @@ description: Learn how to secure a hosted ASP.NET Core Blazor WebAssembly app wi
monikerRange: '>= aspnetcore-3.1 < aspnetcore-8.0'
ms.author: riande
ms.custom: "devx-track-csharp, mvc"
-ms.date: 06/07/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/hosted-with-microsoft-entra-id
---
# Secure a hosted ASP.NET Core Blazor WebAssembly app with Microsoft Entra ID
diff --git a/aspnetcore/blazor/security/webassembly/index.md b/aspnetcore/blazor/security/webassembly/index.md
index 1941588a1270..a69f6ad3c446 100644
--- a/aspnetcore/blazor/security/webassembly/index.md
+++ b/aspnetcore/blazor/security/webassembly/index.md
@@ -5,7 +5,7 @@ description: Learn how to secure Blazor WebAssembly apps as single-page applicat
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/index
---
# Secure ASP.NET Core Blazor WebAssembly
diff --git a/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles-net-5-to-7.md b/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles-net-5-to-7.md
index 8e042aebfabd..49669e820454 100644
--- a/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles-net-5-to-7.md
+++ b/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles-net-5-to-7.md
@@ -5,7 +5,7 @@ description: Learn how to configure Blazor WebAssembly to use Microsoft Entra ID
monikerRange: '>= aspnetcore-5.0 < aspnetcore-8.0'
ms.author: riande
ms.custom: "devx-track-csharp, mvc"
-ms.date: 09/09/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/meid-groups-roles-net5to7
zone_pivot_groups: blazor-groups-and-roles
---
diff --git a/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles.md b/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles.md
index 5c2edd4c9b01..a9159dd406b5 100644
--- a/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles.md
+++ b/aspnetcore/blazor/security/webassembly/microsoft-entra-id-groups-and-roles.md
@@ -5,7 +5,7 @@ description: Learn how to configure Blazor WebAssembly to use Microsoft Entra ID
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: "devx-track-csharp, mvc"
-ms.date: 09/09/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/meid-groups-roles
---
# Microsoft Entra (ME-ID) groups, Administrator Roles, and App Roles
diff --git a/aspnetcore/blazor/security/webassembly/standalone-with-authentication-library.md b/aspnetcore/blazor/security/webassembly/standalone-with-authentication-library.md
index fcfc11cd0a8e..5b7f1aba8474 100644
--- a/aspnetcore/blazor/security/webassembly/standalone-with-authentication-library.md
+++ b/aspnetcore/blazor/security/webassembly/standalone-with-authentication-library.md
@@ -5,7 +5,7 @@ description: Learn how to secure an ASP.NET Core Blazor WebAssembly standalone a
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 06/07/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/standalone-with-authentication-library
---
# Secure an ASP.NET Core Blazor WebAssembly standalone app with the Authentication library
diff --git a/aspnetcore/blazor/security/webassembly/standalone-with-azure-active-directory-b2c.md b/aspnetcore/blazor/security/webassembly/standalone-with-azure-active-directory-b2c.md
index 3c85f04c78c0..efeea36bfd26 100644
--- a/aspnetcore/blazor/security/webassembly/standalone-with-azure-active-directory-b2c.md
+++ b/aspnetcore/blazor/security/webassembly/standalone-with-azure-active-directory-b2c.md
@@ -5,7 +5,7 @@ description: Learn how to secure an ASP.NET Core Blazor WebAssembly standalone a
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 06/07/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/standalone-with-azure-active-directory-b2c
---
# Secure an ASP.NET Core Blazor WebAssembly standalone app with Azure Active Directory B2C
diff --git a/aspnetcore/blazor/security/webassembly/standalone-with-identity.md b/aspnetcore/blazor/security/webassembly/standalone-with-identity.md
index 039ddd0989cf..bff4e36f56f2 100644
--- a/aspnetcore/blazor/security/webassembly/standalone-with-identity.md
+++ b/aspnetcore/blazor/security/webassembly/standalone-with-identity.md
@@ -5,7 +5,7 @@ description: Learn how to secure Blazor WebAssembly apps with ASP.NET Core Ident
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/standalone-with-identity
---
# Secure ASP.NET Core Blazor WebAssembly with ASP.NET Core Identity
diff --git a/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-accounts.md b/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-accounts.md
index 8cb0ad193abd..41ed5963cca3 100644
--- a/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-accounts.md
+++ b/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-accounts.md
@@ -5,7 +5,7 @@ description: Learn how to secure an ASP.NET Core Blazor WebAssembly standalone a
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 06/07/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/standalone-with-microsoft-accounts
---
# Secure an ASP.NET Core Blazor WebAssembly standalone app with Microsoft Accounts
diff --git a/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-entra-id.md b/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-entra-id.md
index 4d13b87e8a38..e4236da8360a 100644
--- a/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-entra-id.md
+++ b/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-entra-id.md
@@ -5,7 +5,7 @@ description: Learn how to secure an ASP.NET Core Blazor WebAssembly standalone a
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: "devx-track-csharp, mvc"
-ms.date: 06/07/2024
+ms.date: 11/12/2024
uid: blazor/security/webassembly/standalone-with-microsoft-entra-id
---
# Secure an ASP.NET Core Blazor WebAssembly standalone app with Microsoft Entra ID
diff --git a/aspnetcore/blazor/state-management.md b/aspnetcore/blazor/state-management.md
index 073365937258..8bf2de725e31 100644
--- a/aspnetcore/blazor/state-management.md
+++ b/aspnetcore/blazor/state-management.md
@@ -5,7 +5,7 @@ description: Learn how to persist user data (state) in Blazor apps.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/state-management
zone_pivot_groups: blazor-app-models
---
diff --git a/aspnetcore/blazor/supported-platforms.md b/aspnetcore/blazor/supported-platforms.md
index ac1c82b1e291..78cb7b0b860c 100644
--- a/aspnetcore/blazor/supported-platforms.md
+++ b/aspnetcore/blazor/supported-platforms.md
@@ -5,7 +5,7 @@ description: Learn about the supported platforms for ASP.NET Core Blazor.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/supported-platforms
---
# ASP.NET Core Blazor supported platforms
diff --git a/aspnetcore/blazor/test.md b/aspnetcore/blazor/test.md
index 0d43b4b85675..e1b60f2428be 100644
--- a/aspnetcore/blazor/test.md
+++ b/aspnetcore/blazor/test.md
@@ -5,7 +5,7 @@ description: Learn how to test Razor components in Blazor apps.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/test
---
# Test Razor components in ASP.NET Core Blazor
diff --git a/aspnetcore/blazor/tooling.md b/aspnetcore/blazor/tooling.md
index 32303a8ea878..74ee3de9ed0c 100644
--- a/aspnetcore/blazor/tooling.md
+++ b/aspnetcore/blazor/tooling.md
@@ -5,7 +5,7 @@ description: Learn about the tools available to build Blazor apps and how to use
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 06/13/2024
+ms.date: 11/12/2024
uid: blazor/tooling
zone_pivot_groups: tooling
---
diff --git a/aspnetcore/blazor/tutorials/build-a-blazor-app.md b/aspnetcore/blazor/tutorials/build-a-blazor-app.md
index 1a197f499203..69afe6142abb 100644
--- a/aspnetcore/blazor/tutorials/build-a-blazor-app.md
+++ b/aspnetcore/blazor/tutorials/build-a-blazor-app.md
@@ -5,7 +5,7 @@ description: Build a Blazor app step-by-step.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/build-a-blazor-app
---
# Build a Blazor todo list app
diff --git a/aspnetcore/blazor/tutorials/index.md b/aspnetcore/blazor/tutorials/index.md
index 2dae9e84b582..b280107f0644 100644
--- a/aspnetcore/blazor/tutorials/index.md
+++ b/aspnetcore/blazor/tutorials/index.md
@@ -5,7 +5,7 @@ description: Learn how to build Blazor apps with the tutorials listed in this ar
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/index
---
# ASP.NET Core Blazor tutorials
diff --git a/aspnetcore/blazor/tutorials/movie-database-app/index.md b/aspnetcore/blazor/tutorials/movie-database-app/index.md
index 7e442bd521b8..53fbf2e61fdf 100644
--- a/aspnetcore/blazor/tutorials/movie-database-app/index.md
+++ b/aspnetcore/blazor/tutorials/movie-database-app/index.md
@@ -3,7 +3,7 @@ title: Build a Blazor movie database app (Overview)
author: guardrex
description: This tutorial explains the basics of building a Blazor Web App with a database, Entity Framework (EF) Core, and user interactivity.
ms.author: riande
-ms.date: 08/26/2024
+ms.date: 11/12/2024
monikerRange: '>= aspnetcore-8.0'
ms.custom: mvc
uid: blazor/tutorials/movie-database-app/index
diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-1.md b/aspnetcore/blazor/tutorials/movie-database-app/part-1.md
index d42d7e619ff6..fbf729753b81 100644
--- a/aspnetcore/blazor/tutorials/movie-database-app/part-1.md
+++ b/aspnetcore/blazor/tutorials/movie-database-app/part-1.md
@@ -5,7 +5,7 @@ description: This part of the Blazor movie database app tutorial explains how to
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/movie-database-app/part-1
zone_pivot_groups: tooling
---
diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-2.md b/aspnetcore/blazor/tutorials/movie-database-app/part-2.md
index ea3f08d8836a..1dc5afc78f2e 100644
--- a/aspnetcore/blazor/tutorials/movie-database-app/part-2.md
+++ b/aspnetcore/blazor/tutorials/movie-database-app/part-2.md
@@ -5,7 +5,7 @@ description: This part of the Blazor movie database app tutorial explains how to
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/movie-database-app/part-2
zone_pivot_groups: tooling
---
diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-3.md b/aspnetcore/blazor/tutorials/movie-database-app/part-3.md
index 0dfe655e1216..53fee73b4848 100644
--- a/aspnetcore/blazor/tutorials/movie-database-app/part-3.md
+++ b/aspnetcore/blazor/tutorials/movie-database-app/part-3.md
@@ -5,7 +5,7 @@ description: This part of the Blazor movie database app tutorial explains the Ra
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/movie-database-app/part-3
zone_pivot_groups: tooling
---
diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-4.md b/aspnetcore/blazor/tutorials/movie-database-app/part-4.md
index 1624688f2abc..5d63933aabed 100644
--- a/aspnetcore/blazor/tutorials/movie-database-app/part-4.md
+++ b/aspnetcore/blazor/tutorials/movie-database-app/part-4.md
@@ -5,7 +5,7 @@ description: This part of the Blazor movie database app tutorial explains the da
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/movie-database-app/part-4
zone_pivot_groups: tooling
---
diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-5.md b/aspnetcore/blazor/tutorials/movie-database-app/part-5.md
index 1f4e6ad6565e..388822ed0feb 100644
--- a/aspnetcore/blazor/tutorials/movie-database-app/part-5.md
+++ b/aspnetcore/blazor/tutorials/movie-database-app/part-5.md
@@ -5,7 +5,7 @@ description: This part of the Blazor movie database app tutorial explains how me
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/movie-database-app/part-5
zone_pivot_groups: tooling
---
diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-6.md b/aspnetcore/blazor/tutorials/movie-database-app/part-6.md
index c48a71e5c13e..1da06c5c5e01 100644
--- a/aspnetcore/blazor/tutorials/movie-database-app/part-6.md
+++ b/aspnetcore/blazor/tutorials/movie-database-app/part-6.md
@@ -5,7 +5,7 @@ description: This part of the Blazor movie database app tutorial explains how to
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/movie-database-app/part-6
zone_pivot_groups: tooling
---
diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-7.md b/aspnetcore/blazor/tutorials/movie-database-app/part-7.md
index 4beff2eaab38..37729fab606d 100644
--- a/aspnetcore/blazor/tutorials/movie-database-app/part-7.md
+++ b/aspnetcore/blazor/tutorials/movie-database-app/part-7.md
@@ -5,7 +5,7 @@ description: This part of the Blazor movie database app tutorial explains how to
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/movie-database-app/part-7
zone_pivot_groups: tooling
---
diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-8.md b/aspnetcore/blazor/tutorials/movie-database-app/part-8.md
index 9c1968bc0c2d..63a076d72492 100644
--- a/aspnetcore/blazor/tutorials/movie-database-app/part-8.md
+++ b/aspnetcore/blazor/tutorials/movie-database-app/part-8.md
@@ -5,7 +5,7 @@ description: This part of the Blazor movie database app tutorial explains how to
monikerRange: '>= aspnetcore-8.0'
ms.author: riande
ms.custom: mvc
-ms.date: 08/26/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/movie-database-app/part-8
zone_pivot_groups: tooling
---
diff --git a/aspnetcore/blazor/tutorials/signalr-blazor.md b/aspnetcore/blazor/tutorials/signalr-blazor.md
index 9b4bf3d7888b..2de34a338d70 100644
--- a/aspnetcore/blazor/tutorials/signalr-blazor.md
+++ b/aspnetcore/blazor/tutorials/signalr-blazor.md
@@ -5,7 +5,7 @@ description: Create a chat app that uses ASP.NET Core SignalR with Blazor.
monikerRange: '>= aspnetcore-3.1'
ms.author: riande
ms.custom: mvc
-ms.date: 06/09/2024
+ms.date: 11/12/2024
uid: blazor/tutorials/signalr-blazor
---
# Use ASP.NET Core SignalR with Blazor
diff --git a/aspnetcore/blazor/webassembly-build-tools-and-aot.md b/aspnetcore/blazor/webassembly-build-tools-and-aot.md
index edfd8cafae32..0f36894d8757 100644
--- a/aspnetcore/blazor/webassembly-build-tools-and-aot.md
+++ b/aspnetcore/blazor/webassembly-build-tools-and-aot.md
@@ -5,7 +5,7 @@ description: Learn about the WebAssembly build tools and how to compile a Blazor
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 04/12/2024
+ms.date: 11/12/2024
uid: blazor/tooling/webassembly
---
# ASP.NET Core Blazor WebAssembly build tools and ahead-of-time (AOT) compilation
diff --git a/aspnetcore/blazor/webassembly-lazy-load-assemblies.md b/aspnetcore/blazor/webassembly-lazy-load-assemblies.md
index a7bd860b3616..966d788c6ab6 100644
--- a/aspnetcore/blazor/webassembly-lazy-load-assemblies.md
+++ b/aspnetcore/blazor/webassembly-lazy-load-assemblies.md
@@ -5,7 +5,7 @@ description: Discover how to lazy load assemblies in Blazor WebAssembly apps.
monikerRange: '>= aspnetcore-5.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/webassembly-lazy-load-assemblies
---
# Lazy load assemblies in ASP.NET Core Blazor WebAssembly
diff --git a/aspnetcore/blazor/webassembly-native-dependencies.md b/aspnetcore/blazor/webassembly-native-dependencies.md
index 60e4fb5b4993..078dad2387c9 100644
--- a/aspnetcore/blazor/webassembly-native-dependencies.md
+++ b/aspnetcore/blazor/webassembly-native-dependencies.md
@@ -5,7 +5,7 @@ description: Learn how to build Blazor WebAssembly apps with native dependencies
monikerRange: '>= aspnetcore-6.0'
ms.author: riande
ms.custom: mvc
-ms.date: 02/09/2024
+ms.date: 11/12/2024
uid: blazor/webassembly-native-dependencies
---
# ASP.NET Core Blazor WebAssembly native dependencies
diff --git a/aspnetcore/toc.yml b/aspnetcore/toc.yml
index 00da4e252abb..008f3fed6f2f 100644
--- a/aspnetcore/toc.yml
+++ b/aspnetcore/toc.yml
@@ -546,8 +546,10 @@ items:
uid: blazor/components/dynamiccomponent
- name: QuickGrid component
uid: blazor/components/quickgrid
- - name: Prerender and integrate components
+ - name: Integrate with MVC/Razor Pages
uid: blazor/components/integration
+ - name: Integrate with MVC/Razor Pages (hosted WebAssembly)
+ uid: blazor/components/integration-hosted-webassembly
- name: Class libraries
uid: blazor/components/class-libraries
- name: Class libraries with static SSR