11 KiB
title | author | description | monikerRange | ms.author | ms.custom | ms.date | no-loc | uid | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Integrate ASP.NET Core Razor components into Razor Pages and MVC apps | guardrex | Learn about data binding scenarios for components and DOM elements in Blazor apps. | >= aspnetcore-3.1 | riande | mvc | 04/25/2020 |
|
blazor/components/integrate-components-into-razor-pages-and-mvc-apps |
Integrate ASP.NET Core Razor components into Razor Pages and MVC apps
By Luke Latham and Daniel Roth
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.
After preparing the app, use the guidance in the following sections depending on the app's requirements:
- 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
directive. - 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.
Prepare the app
An existing Razor Pages or MVC app can integrate Razor components into pages and views:
-
In the app's layout file (
_Layout.cshtml
):-
Add the following
<base>
tag to the<head>
element:<base href="~/" />
The
href
value (the app base path) in the preceding example assumes that the app resides at the root URL path (/
). If the app is a sub-application, follow the guidance in the App base path section of the xref:blazor/host-and-deploy/index#app-base-path article.The
_Layout.cshtml
file is located in the Pages/Shared folder in a Razor Pages app or Views/Shared folder in an MVC app. -
Add a
<script>
tag for the blazor.server.js script immediately before the closing</body>
tag:<script src="_framework/blazor.server.js"></script>
The framework adds the blazor.server.js script to the app. There's no need to manually add the script to the app.
-
-
Add an
_Imports.razor
file to the root folder of the project with the following content (change the last namespace,MyAppNamespace
, to the namespace of the app):@using System.Net.Http @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web @using Microsoft.JSInterop @using MyAppNamespace
-
In
Startup.ConfigureServices
, register the Blazor Server service:services.AddServerSideBlazor();
-
In
Startup.Configure
, add the Blazor Hub endpoint toapp.UseEndpoints
:endpoints.MapBlazorHub();
-
Integrate components into any page or view. For more information, see the Render components from a page or view section.
Use routable components in a Razor Pages app
This section pertains to adding components that are directly routable from user requests.
To support routable Razor components in Razor Pages apps:
-
Follow the guidance in the Prepare the app section.
-
Add an
App.razor
file to the project root with the following content:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="@typeof(Program).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <h1>Page not found</h1> <p>Sorry, but there's nothing here!</p> </NotFound> </Router>
-
Add a
_Host.cshtml
file to thePages
folder with the following content:@page "/blazor" @{ Layout = "_Layout"; } <app> <component type="typeof(App)" render-mode="ServerPrerendered" /> </app>
Components use the shared
_Layout.cshtml
file for their layout.xref:Microsoft.AspNetCore.Mvc.Rendering.RenderMode configures whether the
App
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.
Render Mode Description xref:Microsoft.AspNetCore.Mvc.Rendering.RenderMode.ServerPrerendered Renders the App
component into static HTML and includes a marker for a Blazor Server app. When the user-agent starts, this marker is used to bootstrap a Blazor app.xref:Microsoft.AspNetCore.Mvc.Rendering.RenderMode.Server Renders a marker for a Blazor Server app. Output from the App
component isn't included. When the user-agent starts, this marker is used to bootstrap a Blazor app.xref:Microsoft.AspNetCore.Mvc.Rendering.RenderMode.Static Renders the App
component into static HTML.For more information on the Component Tag Helper, see xref:mvc/views/tag-helpers/builtin-th/component-tag-helper.
-
Add a low-priority route for the
_Host.cshtml
page to endpoint configuration inStartup.Configure
:app.UseEndpoints(endpoints => { ... endpoints.MapFallbackToPage("/_Host"); });
-
Add routable components to the app. For example:
@page "/counter" <h1>Counter</h1> ...
For more information on namespaces, see the Component namespaces section.
Use routable components in an MVC app
This section pertains to adding components that are directly routable from user requests.
To support routable Razor components in MVC apps:
-
Follow the guidance in the Prepare the app section.
-
Add an
App.razor
file to the root of the project with the following content:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="@typeof(Program).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <h1>Page not found</h1> <p>Sorry, but there's nothing here!</p> </NotFound> </Router>
-
Add a
_Host.cshtml
file to theViews/Home
folder with the following content:@{ Layout = "_Layout"; } <app> <component type="typeof(App)" render-mode="ServerPrerendered" /> </app>
Components use the shared
_Layout.cshtml
file for their layout.xref:Microsoft.AspNetCore.Mvc.Rendering.RenderMode configures whether the
App
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.
Render Mode Description xref:Microsoft.AspNetCore.Mvc.Rendering.RenderMode.ServerPrerendered Renders the App
component into static HTML and includes a marker for a Blazor Server app. When the user-agent starts, this marker is used to bootstrap a Blazor app.xref:Microsoft.AspNetCore.Mvc.Rendering.RenderMode.Server Renders a marker for a Blazor Server app. Output from the App
component isn't included. When the user-agent starts, this marker is used to bootstrap a Blazor app.xref:Microsoft.AspNetCore.Mvc.Rendering.RenderMode.Static Renders the App
component into static HTML.For more information on the Component Tag Helper, see xref:mvc/views/tag-helpers/builtin-th/component-tag-helper.
-
Add an action to the Home controller:
public IActionResult Blazor() { return View("_Host"); }
-
Add a low-priority route for the controller action that returns the
_Host.cshtml
view to the endpoint configuration inStartup.Configure
:app.UseEndpoints(endpoints => { ... endpoints.MapFallbackToController("Blazor", "Home"); });
-
Create a
Pages
folder and add routable components to the app. For example:@page "/counter" <h1>Counter</h1> ...
For more information on namespaces, see the Component namespaces section.
Render components from a page or view
This section pertains to adding components to pages or views, where the components aren't directly routable from user requests.
To render a component from a page or view, use the Component Tag Helper.
Render stateful interactive components
Stateful interactive components can be added to a Razor page or view.
When the page or view renders:
- The component is prerendered with the page or view.
- The initial component state used for prerendering is lost.
- New component state is created when the SignalR connection is established.
The following Razor page renders a Counter
component:
<h1>My Razor Page</h1>
<component type="typeof(Counter)" render-mode="ServerPrerendered"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
For more information, see xref:mvc/views/tag-helpers/builtin-th/component-tag-helper.
Render noninteractive components
In the following Razor page, the Counter
component is statically rendered with an initial value that's specified using a form. Since the component is statically rendered, the component isn't interactive:
<h1>My Razor Page</h1>
<form>
<input type="number" asp-for="InitialValue" />
<button type="submit">Set initial value</button>
</form>
<component type="typeof(Counter)" render-mode="Static"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
For more information, see xref:mvc/views/tag-helpers/builtin-th/component-tag-helper.
Component namespaces
When using a custom folder to hold the app's components, add the namespace representing the folder to either the page/view or to the _ViewImports.cshtml
file. In the following example:
- Change
MyAppNamespace
to the app's namespace. - If a folder named Components isn't used to hold the components, change
Components
to the folder where the components reside.
@using MyAppNamespace.Components
The _ViewImports.cshtml
file is located in the Pages
folder of a Razor Pages app or the Views
folder of an MVC app.
For more information, see xref:blazor/components/index#namespaces.