Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Notitie
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie de .NET- en .NET Core-ondersteuningsbeleidvoor meer informatie. Zie de .NET 9-versie van dit artikelvoor de huidige release.
Belangrijk
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikelvoor de huidige release.
Razor-componenten kunnen worden geïntegreerd in Razor Pages of MVC-apps. Wanneer de pagina of weergave wordt gerenderd, kunnen componenten tegelijkertijd worden voorgeladen.
Belangrijk
Frameworkwijzigingen in ASP.NET Core-releases hebben geleid tot verschillende sets instructies in dit artikel. Voordat u de richtlijnen van dit artikel gebruikt, controleert u of de documentversiekiezer boven aan dit artikel overeenkomt met de versie van ASP.NET Core die u voor uw app wilt gebruiken.
Prerendering kan seo (Search Engine Optimization) verbeteren door inhoud weer te geven voor het eerste HTTP-antwoord dat zoekmachines kunnen gebruiken om de paginarang te berekenen.
Nadat u het project hebt geconfigureerd, gebruikt u de richtlijnen in de volgende secties, afhankelijk van de vereisten van het project:
- Voor onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen. Volg deze richtlijnen wanneer bezoekers een HTTP-aanvraag in hun browser moeten kunnen indienen voor een onderdeel met een
@page
richtlijn. - Zie de onderdelen weergeven van een pagina of weergavesectie voor onderdelen die niet rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen. Volg deze richtlijnen wanneer de app onderdelen insluit in bestaande pagina's of weergaven met de Helper voor onderdeeltags.
Configuratie
Gebruik de volgende richtlijnen om Razor componenten te integreren in pagina's of weergaven van een bestaande Razor Pagina's- of MVC-app.
Voeg een importbestand toe aan de hoofdmap van het project met de volgende inhoud. Wijzig de
{APP NAMESPACE}
placeholder naar de naamruimte van het project._Imports.razor
:@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.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using {APP NAMESPACE}
In het projectlayoutbestand (
Pages/Shared/_Layout.cshtml
in Razor Pages-apps ofViews/Shared/_Layout.cshtml
in MVC-apps):Voeg de volgende
<base>
tag en HeadOutlet component Tag Helper toe aan het<head>
element:<base href="~/" /> <component type="typeof(Microsoft.AspNetCore.Components.Web.HeadOutlet)" render-mode="ServerPrerendered" />
Bij de
href
waarde (het basispad van de app) in het vorige voorbeeld wordt ervan uitgegaan dat de app zich op het hoofd-URL-pad (/
) bevindt. Als de app een subtoepassing is, raadpleegt u het basispad van de ASP.NET Core-app.Het HeadOutlet onderdeel wordt gebruikt om hoofdinhoud (
<head>
) weer te geven voor paginatitels (PageTitle onderdeel) en andere hoofdelementen (HeadContent onderdeel) die zijn ingesteld door Razor onderdelen. Zie Hoofdinhoud beheren in ASP.NET Core-apps Blazorvoor meer informatie.Voeg een
<script>
tag toe voor hetblazor.server.js
script direct vóór deScripts
rendersectie (@await RenderSectionAsync(...)
):<script src="_framework/blazor.server.js"></script>
Het framework voegt het
blazor.server.js
script toe aan de app. U hoeft geen scriptbestand handmatig aan de app toe te voegenblazor.server.js
.
Notitie
Normaal gesproken wordt de indeling geladen via een
_ViewStart.cshtml
bestand.Registreer de Blazor Server services in
Program.cs
waar services zijn geregistreerd.builder.Services.AddServerSideBlazor();
Voeg het Blazor Hub-eindpunt toe aan de eindpunten van
Program.cs
waar routes zijn geconfigureerd. Plaats de volgende regel na het aanroepen vanMapRazorPages
(Razor Pagina's) ofMapControllerRoute
(MVC):app.MapBlazorHub();
Integreer onderdelen in een pagina of weergave. Voeg bijvoorbeeld een
Counter
component toe aan deShared
map van het project.Pages/Shared/Counter.razor
(Razor Pagina's) OfViews/Shared/Counter.razor
(MVC):<h1>Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Razor Pagina's:
Op de
Index
-pagina van een Razor Pagina-app, voeg de naamruimte van hetCounter
onderdeel toe en sluit het onderdeel in op de pagina. Wanneer deIndex
pagina wordt geladen, wordt hetCounter
onderdeel vooraf gegenereerd op de pagina. Vervang in het volgende voorbeeld de{APP NAMESPACE}
tijdelijke aanduiding door de naamruimte van het project.Pages/Index.cshtml
:@page @using {APP NAMESPACE}.Pages.Shared @model IndexModel @{ ViewData["Title"] = "Home page"; } <component type="typeof(Counter)" render-mode="ServerPrerendered" />
MVC:
Voeg in de projectweergave
Index
van een MVC-app de naamruimte van hetCounter
onderdeel toe en sluit het onderdeel in de weergave in. Wanneer deIndex
weergave wordt geladen, wordt hetCounter
onderdeel vooraf op de pagina weergegeven. Vervang in het volgende voorbeeld de{APP NAMESPACE}
tijdelijke aanduiding door de naamruimte van het project.Views/Home/Index.cshtml
:@using {APP NAMESPACE}.Views.Shared @{ ViewData["Title"] = "Home Page"; } <component type="typeof(Counter)" render-mode="ServerPrerendered" />
Zie de onderdelen weergeven van een pagina of weergavesectie voor meer informatie.
Routeerbare onderdelen gebruiken in een Razor Pages-app
Deze sectie heeft betrekking op het toevoegen van onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Om routeerbare Razor componenten in Razor Pages-apps te ondersteunen:
Volg de richtlijnen in de sectie Configuratie .
Voeg een
App
component toe aan de hoofdmap van het project met de volgende inhoud.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(App).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <PageTitle>Not found</PageTitle> <p role="alert">Sorry, there's nothing at this address.</p> </NotFound> </Router>
Voeg een
_Host
pagina toe aan het project met de volgende inhoud. Vervang de{APP NAMESPACE}
tijdelijke aanduiding door de namespace van de app.Pages/_Host.cshtml
:@page @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers <component type="typeof(App)" render-mode="ServerPrerendered" />
Notitie
In het voorgaande voorbeeld wordt ervan uitgegaan dat het HeadOutlet onderdeel en Blazor het script (
_framework/blazor.server.js
) worden weergegeven door de indeling van de app. Zie de sectie Configuratie voor meer informatie.Met RenderMode configureert u of het
App
onderdeel:- Wordt voorgerenderd in de pagina.
- Wordt weergegeven als statische HTML op de pagina of als deze de benodigde informatie bevat voor het opstarten van een Blazor app van de gebruikersagent.
Zie Component RenderMode voor meer informatie over de Component Tag Helper, inclusief het doorgeven van parameters en configuratie.
Voeg in de
Program.cs
eindpunten een route met lage prioriteit toe voor de_Host
pagina als het laatste eindpunt:app.MapFallbackToPage("/_Host");
Routeerbare onderdelen toevoegen aan het project. Het volgende voorbeeld is een
RoutableCounter
onderdeel op basis van hetCounter
onderdeel in de Blazor projectsjablonen.Pages/RoutableCounter.razor
:@page "/routable-counter" <PageTitle>Routable Counter</PageTitle> <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Voer het project uit en navigeer naar het routeerbare
RoutableCounter
onderdeel op/routable-counter
.
Zie de sectie Component-naamruimten voor meer informatie over naamruimten.
Routeerbare onderdelen gebruiken in een MVC-app
Deze sectie heeft betrekking op het toevoegen van onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Routeerbare Razor onderdelen in MVC-apps ondersteunen:
Volg de richtlijnen in de sectie Configuratie .
Voeg een
App
component toe aan de hoofdmap van het project met de volgende inhoud.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(App).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <PageTitle>Not found</PageTitle> <p role="alert">Sorry, there's nothing at this address.</p> </NotFound> </Router>
Voeg een
_Host
weergave toe aan het project met de volgende inhoud. Vervang de{APP NAMESPACE}
tijdelijke aanduiding door de namespace van de app.Views/Home/_Host.cshtml
:@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers <component type="typeof(App)" render-mode="ServerPrerendered" />
Notitie
In het voorgaande voorbeeld wordt ervan uitgegaan dat het HeadOutlet onderdeel en Blazor het script (
_framework/blazor.server.js
) worden weergegeven door de indeling van de app. Zie de sectie Configuratie voor meer informatie.Met RenderMode configureert u of het
App
onderdeel:- Wordt voorgerenderd in de pagina.
- Wordt weergegeven als statische HTML op de pagina of als deze de benodigde informatie bevat voor het opstarten van een Blazor app van de gebruikersagent.
Zie Component RenderMode voor meer informatie over de Component Tag Helper, inclusief het doorgeven van parameters en configuratie.
Voeg een actie toe aan de Home controller.
Controllers/HomeController.cs
:public IActionResult Blazor() { return View("_Host"); }
Voeg in de
Program.cs
eindpunten een route met lage prioriteit toe voor de controlleractie die de_Host
weergave retourneert:app.MapFallbackToController("Blazor", "Home");
Maak een
Pages
map in de MVC-app en voeg routeerbare onderdelen toe. Het volgende voorbeeld is eenRoutableCounter
onderdeel op basis van hetCounter
onderdeel in de Blazor projectsjablonen.Pages/RoutableCounter.razor
:@page "/routable-counter" <PageTitle>Routable Counter</PageTitle> <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Voer het project uit en navigeer naar het routeerbare
RoutableCounter
onderdeel op/routable-counter
.
Zie de sectie Component-naamruimten voor meer informatie over naamruimten.
Onderdelen van een pagina of weergave weergeven
Deze sectie heeft betrekking op het toevoegen van onderdelen aan pagina's of weergaven, waarbij de onderdelen niet rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Als u een onderdeel van een pagina of weergave wilt weergeven, gebruikt u de Helper voor onderdeeltags.
Render statusgevoelige interactieve componenten
Stateful interactieve componenten kunnen aan een Razor pagina of weergave worden toegevoegd.
Wanneer de pagina of weergave wordt weergegeven:
- Het onderdeel wordt vooraf gerenderd met de pagina of weergave.
- De initiële onderdeelstatus die wordt gebruikt voor prerendering, gaat verloren.
- Er wordt een nieuwe onderdeelstatus gemaakt wanneer de SignalR verbinding tot stand is gebracht.
Op de volgende Razor pagina wordt een Counter
onderdeel weergegeven:
<h1>Razor Page</h1>
<component type="typeof(Counter)" render-mode="ServerPrerendered"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Zie Component Tag Helper in ASP.NET Corevoor meer informatie.
Niet-inactieve onderdelen weergeven
Op de volgende Razor pagina wordt het Counter
onderdeel statisch weergegeven met een initiële waarde die is opgegeven met behulp van een formulier. Omdat het onderdeel statisch wordt weergegeven, is het onderdeel niet interactief:
<h1>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; }
}
Zie Component Tag Helper in ASP.NET Corevoor meer informatie.
Onderdeelnaamruimten
Wanneer u een aangepaste map gebruikt om de onderdelen van Razor het project op te slaan, voegt u de naamruimte toe die de map vertegenwoordigt aan de pagina/weergave of aan het _ViewImports.cshtml
bestand. In het volgende voorbeeld:
- Onderdelen worden opgeslagen in de
Components
map van het project. - De
{APP NAMESPACE}
placeholder is de naamruimte van het project.Components
vertegenwoordigt de naam van de map.
@using {APP NAMESPACE}.Components
Het _ViewImports.cshtml
bestand bevindt zich in de Pages
map van een Razor Pagina-app of de Views
map van een MVC-app.
Zie ASP.NET Core Razor-onderdelenvoor meer informatie.
Bewaar vooraf gerenderde toestand
Zonder dat de vooraf gegenereerde status behouden blijft, gaat de status die tijdens het prerenderen wordt gebruikt verloren en moet deze opnieuw worden gemaakt wanneer de app volledig is geladen. Als een toestand asynchroon wordt ingesteld, kan de gebruikersinterface flikkeren omdat de vooraf weergegeven gebruikersinterface wordt vervangen door tijdelijke tijdelijke aanduidingen en vervolgens opnieuw volledig wordt gerenderd.
Als u de status wilt behouden voor vooraf gegenereerde onderdelen, gebruikt u de Helper voor persistente statustags (referentiebron). Voeg de tag van de Tag Helper, <persist-component-state />
, toe binnen de sluitende </body>
-tag van de _Host
-pagina in een app die onderdelen vooraf rendert.
Notitie
Documentatiekoppelingen naar .NET-referentiebron laden meestal de standaardbranch van de opslagplaats, die de huidige ontwikkeling vertegenwoordigt voor de volgende release van .NET. Als u een tag voor een specifieke release wilt selecteren, gebruikt u de Switch branches of tags vervolgkeuzelijst. Zie Een versietag selecteren van ASP.NET Core-broncode (dotnet/AspNetCore.Docs #26205)voor meer informatie.
In Pages/_Host.cshtml
van Blazor apps die ServerPrerendered
zijn in een Blazor Server app:
<body>
...
<persist-component-state />
</body>
Bepaal welke status moet worden behouden met behulp van de PersistentComponentState service. Het [SupplyParameterFromPersistentComponentState]
-attribuut dat wordt toegepast op een eigenschap registreert een callback om de toestand te behouden tijdens prerendering en laadt deze wanneer de component interactief rendert of de service wordt geïnstantieerd.
In het volgende voorbeeld, vertegenwoordigt de {TYPE}
-placeholder het type gegevens dat moet worden behouden (bijvoorbeeld WeatherForecast[]
).
@code {
[SupplyParameterFromPersistentComponentState]
public {TYPE} Data { get; set; }
protected override async Task OnInitializedAsync()
{
Data ??= await ...;
}
}
In het volgende voorbeeld houdt de WeatherForecastPreserveState
-component de weersverwachtingstatus vast tijdens het voorrenderen en haalt vervolgens de status op om de component te initialiseren. De Helper voor persistente onderdeelstatustags blijft de status van het onderdeel behouden na alle aanroepen van onderdelen.
WeatherForecastPreserveState.razor
:
@page "/weather-forecast-preserve-state"
@using BlazorSample.Shared
@inject IWeatherForecastService WeatherForecastService
<PageTitle>Weather Forecast</PageTitle>
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (Forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in Forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
[SupplyParameterFromPersistentComponentState]
public WeatherForecast[]? Forecasts { get; set; }
protected override async Task OnInitializedAsync()
{
Forecasts ??= await WeatherForecastService.GetForecastAsync(
DateOnly.FromDateTime(DateTime.Now));
}
}
Bepaal welke status moet worden behouden met behulp van de PersistentComponentState service. PersistentComponentState.RegisterOnPersisting registreert een callback om de onderdeelstatus te behouden voordat de app wordt onderbroken. De status wordt opgehaald wanneer de toepassing wordt hervat. Maak de aanroep aan het einde van de initialisatiecode om tijdens het afsluiten van de app een potentiële raceconditie te voorkomen.
In het volgende voorbeeld:
- De
{TYPE}
tijdelijke aanduiding vertegenwoordigt het type gegevens dat moet worden bewaard (bijvoorbeeldWeatherForecast[]
). - De
{TOKEN}
placeholder is een staat-identificatiestring (bijvoorbeeld,fetchdata
).
@implements IDisposable
@inject PersistentComponentState ApplicationState
...
@code {
private {TYPE} data;
private PersistingComponentStateSubscription persistingSubscription;
protected override async Task OnInitializedAsync()
{
if (!ApplicationState.TryTakeFromJson<{TYPE}>(
"{TOKEN}", out var restored))
{
data = await ...;
}
else
{
data = restored!;
}
// Call at the end to avoid a potential race condition at app shutdown
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistData);
}
private Task PersistData()
{
ApplicationState.PersistAsJson("{TOKEN}", data);
return Task.CompletedTask;
}
void IDisposable.Dispose()
{
persistingSubscription.Dispose();
}
}
In het volgende voorbeeld houdt de WeatherForecastPreserveState
-component de weersverwachtingstatus vast tijdens het voorrenderen en haalt vervolgens de status op om de component te initialiseren. De Helper voor persistente onderdeelstatustags blijft de status van het onderdeel behouden na alle aanroepen van onderdelen.
Pages/WeatherForecastPreserveState.razor
:
@page "/weather-forecast-preserve-state"
@using BlazorSample.Shared
@implements IDisposable
@inject IWeatherForecastService WeatherForecastService
@inject PersistentComponentState ApplicationState
<PageTitle>Weather Forecast</PageTitle>
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[] forecasts = Array.Empty<WeatherForecast>();
private PersistingComponentStateSubscription persistingSubscription;
protected override async Task OnInitializedAsync()
{
if (!ApplicationState.TryTakeFromJson<WeatherForecast[]>(
nameof(forecasts), out var restored))
{
forecasts =
await WeatherForecastService.GetForecastAsync(
DateOnly.FromDateTime(DateTime.Now));
}
else
{
forecasts = restored!;
}
// Call at the end to avoid a potential race condition at app shutdown
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistData);
}
private Task PersistData()
{
ApplicationState.PersistAsJson(nameof(forecasts), forecasts);
return Task.CompletedTask;
}
void IDisposable.Dispose()
{
persistingSubscription.Dispose();
}
}
Door onderdelen te initialiseren met dezelfde status die tijdens het prerenderen wordt gebruikt, worden dure initialisatiestappen slechts één keer uitgevoerd. De gerenderde gebruikersinterface komt ook overeen met de vooraf gegenereerde gebruikersinterface, dus er treedt geen flikkering op in de browser.
De persistente vooraf gegenereerde status wordt overgebracht naar de client, waar deze wordt gebruikt om de status van het onderdeel te herstellen. ASP.NET Core Data Protection zorgt ervoor dat de gegevens veilig worden overgedragen in Blazor Server apps.
Vooraf weergegeven statusgrootte en SignalR limiet voor berichtgrootte
Een grote vooraf berekende statusgrootte kan groter zijn dan de berichtgrootte limiet van het circuit van BlazorSignalR, wat resulteert in het volgende:
- Het SignalR-circuit initialiseert niet vanwege een fout op de client: Circuit host not initialized.
- De gebruikersinterface voor opnieuw verbinden op de client wordt weergegeven wanneer het circuit mislukt. Herstel is niet mogelijk.
Gebruik van de volgende methoden om het probleem op te lossen:
- Verminder de hoeveelheid gegevens die u in de vooraf weergegeven status plaatst.
- Verhoog de limiet voor SignalR berichtgrootte. WAARSCHUWING: Als u de limiet verhoogt, kan het risico op DoS-aanvallen (Denial of Service) toenemen.
Aanvullende Blazor Server informatiebronnen
- Statusbeheer: prerendering afhandelen
- Razor levenscyclusonderwerpen van componenten die betrekking hebben op prerendering
- Verificatie en autorisatie: Algemene aspecten
- fouten verwerken: vooraf genereren
- Blazor
- Bedreigingsvermindering: Cross-site scripting-aanvallen (XSS)
wordt twee keer uitgevoerd tijdens het prerenderen: asynchrone navigatiegebeurtenissen afhandelen met
Prerendering kan seo (Search Engine Optimization) verbeteren door inhoud weer te geven voor het eerste HTTP-antwoord dat zoekmachines kunnen gebruiken om de paginarang te berekenen.
Nadat u het project hebt geconfigureerd, gebruikt u de richtlijnen in de volgende secties, afhankelijk van de vereisten van het project:
- Routeerbare onderdelen: Voor onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen. Volg deze richtlijnen wanneer bezoekers een HTTP-aanvraag in hun browser moeten kunnen indienen voor een onderdeel met een
@page
richtlijn. - Onderdelen weergeven vanaf een pagina of weergave: Voor onderdelen die niet rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen. Volg deze richtlijnen wanneer de app onderdelen insluit in bestaande pagina's of weergaven met de Helper voor onderdeeltags.
Configuratie
Gebruik de volgende richtlijnen om Razor componenten te integreren in pagina's of weergaven van een bestaande Razor Pagina's- of MVC-app.
Belangrijk
Het gebruik van een indelingspagina (_Layout.cshtml
) met een Component Tag Helper voor een HeadOutlet onderdeel is vereist voor het beheren <head>
van inhoud, zoals de titel (PageTitle component) van de pagina en andere hoofdelementen (HeadContent onderdeel). Zie Hoofdinhoud beheren in ASP.NET Core-apps Blazorvoor meer informatie.
In het indelingsbestand van het project:
Voeg de volgende
<base>
tag en HeadOutlet component-taghelper toe aan het<head>
element inPages/Shared/_Layout.cshtml
(Razor Pagina's) ofViews/Shared/_Layout.cshtml
(MVC):<base href="~/" /> <component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
Bij de
href
waarde (het basispad van de app) in het vorige voorbeeld wordt ervan uitgegaan dat de app zich op het hoofd-URL-pad (/
) bevindt. Als de app een subtoepassing is, raadpleegt u het basispad van de ASP.NET Core-app.Het HeadOutlet onderdeel wordt gebruikt om hoofdinhoud (
<head>
) weer te geven voor paginatitels (PageTitle onderdeel) en andere hoofdelementen (HeadContent onderdeel) die zijn ingesteld door Razor onderdelen. Zie Hoofdinhoud beheren in ASP.NET Core-apps Blazorvoor meer informatie.Voeg direct vóór de
<script>
rendersectie (blazor.server.js
) eenScripts
tag toe voor het@await RenderSectionAsync(...)
script in de indeling van de app.Pages/Shared/_Layout.cshtml
(Razor Pagina's) OfViews/Shared/_Layout.cshtml
(MVC):<script src="_framework/blazor.server.js"></script>
Het framework voegt het
blazor.server.js
script toe aan de app. U hoeft geen scriptbestand handmatig aan de app toe te voegenblazor.server.js
.
Voeg een importbestand toe aan de hoofdmap van het project met de volgende inhoud. Wijzig de
{APP NAMESPACE}
placeholder naar de naamruimte van het project._Imports.razor
:@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.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using {APP NAMESPACE}
Registreer de Blazor Server services in
Program.cs
waar services zijn geregistreerd.builder.Services.AddServerSideBlazor();
Voeg het Blazor Hub-eindpunt toe aan de eindpunten van
Program.cs
waar routes zijn geconfigureerd.Plaats de volgende regel na het aanroepen van
MapRazorPages
(Razor Pagina's) ofMapControllerRoute
(MVC):app.MapBlazorHub();
Integreer onderdelen in een pagina of weergave. Voeg bijvoorbeeld een
Counter
component toe aan deShared
map van het project.Pages/Shared/Counter.razor
(Razor Pagina's) OfViews/Shared/Counter.razor
(MVC):<h1>Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Razor Pagina's:
Op de
Index
-pagina van een Razor Pagina-app, voeg de naamruimte van hetCounter
onderdeel toe en sluit het onderdeel in op de pagina. Wanneer deIndex
pagina wordt geladen, wordt hetCounter
onderdeel vooraf gegenereerd op de pagina. Vervang in het volgende voorbeeld de{APP NAMESPACE}
tijdelijke aanduiding door de naamruimte van het project.Pages/Index.cshtml
:@page @using {APP NAMESPACE}.Pages.Shared @model IndexModel @{ ViewData["Title"] = "Home page"; } <component type="typeof(Counter)" render-mode="ServerPrerendered" />
MVC:
Voeg in de projectweergave
Index
van een MVC-app de naamruimte van hetCounter
onderdeel toe en sluit het onderdeel in de weergave in. Wanneer deIndex
weergave wordt geladen, wordt hetCounter
onderdeel vooraf op de pagina weergegeven. Vervang in het volgende voorbeeld de{APP NAMESPACE}
tijdelijke aanduiding door de naamruimte van het project.Views/Home/Index.cshtml
:@using {APP NAMESPACE}.Views.Shared @{ ViewData["Title"] = "Home Page"; } <component type="typeof(Counter)" render-mode="ServerPrerendered" />
Zie de onderdelen weergeven van een pagina of weergavesectie voor meer informatie.
Routeerbare onderdelen gebruiken in een Razor Pages-app
Deze sectie heeft betrekking op het toevoegen van onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Om routeerbare Razor componenten in Razor Pages-apps te ondersteunen:
Volg de richtlijnen in de sectie Configuratie .
Voeg een
App
component toe aan de hoofdmap van het project met de volgende inhoud.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(App).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <PageTitle>Not found</PageTitle> <p role="alert">Sorry, there's nothing at this address.</p> </NotFound> </Router>
Voeg een
_Host
pagina toe aan het project met de volgende inhoud.Pages/_Host.cshtml
:@page "/blazor" @namespace {APP NAMESPACE}.Pages.Shared @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @{ Layout = "_Layout"; } <component type="typeof(App)" render-mode="ServerPrerendered" />
In dit scenario gebruiken onderdelen het gedeelde
_Layout.cshtml
bestand voor hun indeling.Belangrijk
Het gebruik van een indelingspagina (
_Layout.cshtml
) met een Component Tag Helper voor een HeadOutlet onderdeel is vereist voor het beheren<head>
van inhoud, zoals de titel (PageTitle component) van de pagina en andere hoofdelementen (HeadContent onderdeel). Zie Hoofdinhoud beheren in ASP.NET Core-apps Blazorvoor meer informatie.Met RenderMode configureert u of het
App
onderdeel:- Wordt voorgerenderd in de pagina.
- Wordt weergegeven als statische HTML op de pagina of als deze de benodigde informatie bevat voor het opstarten van een Blazor app van de gebruikersagent.
Zie Component RenderMode voor meer informatie over de Component Tag Helper, inclusief het doorgeven van parameters en configuratie.
Voeg in de
Program.cs
eindpunten een route met lage prioriteit toe voor de_Host
pagina als het laatste eindpunt:app.MapFallbackToPage("/_Host");
Routeerbare onderdelen toevoegen aan het project. Het volgende voorbeeld is een
RoutableCounter
onderdeel op basis van hetCounter
onderdeel in de Blazor projectsjablonen.Pages/RoutableCounter.razor
:@page "/routable-counter" <PageTitle>Routable Counter</PageTitle> <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Voer het project uit en navigeer naar het routeerbare
RoutableCounter
onderdeel op/routable-counter
.
Zie de sectie Component-naamruimten voor meer informatie over naamruimten.
Routeerbare onderdelen gebruiken in een MVC-app
Deze sectie heeft betrekking op het toevoegen van onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Routeerbare Razor onderdelen in MVC-apps ondersteunen:
Volg de richtlijnen in de sectie Configuratie .
Voeg een
App
component toe aan de hoofdmap van het project met de volgende inhoud.App.razor
:@using Microsoft.AspNetCore.Components.Routing <Router AppAssembly="typeof(App).Assembly"> <Found Context="routeData"> <RouteView RouteData="routeData" /> </Found> <NotFound> <PageTitle>Not found</PageTitle> <p role="alert">Sorry, there's nothing at this address.</p> </NotFound> </Router>
Voeg een
_Host
weergave toe aan het project met de volgende inhoud.Views/Home/_Host.cshtml
:@namespace {APP NAMESPACE}.Views.Shared @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @{ Layout = "_Layout"; } <component type="typeof(App)" render-mode="ServerPrerendered" />
Onderdelen gebruiken het gedeelde
_Layout.cshtml
bestand voor hun indeling.Belangrijk
Het gebruik van een indelingspagina (
_Layout.cshtml
) met een Component Tag Helper voor een HeadOutlet onderdeel is vereist voor het beheren<head>
van inhoud, zoals de titel (PageTitle component) van de pagina en andere hoofdelementen (HeadContent onderdeel). Zie Hoofdinhoud beheren in ASP.NET Core-apps Blazorvoor meer informatie.Met RenderMode configureert u of het
App
onderdeel:- Wordt voorgerenderd in de pagina.
- Wordt weergegeven als statische HTML op de pagina of als deze de benodigde informatie bevat voor het opstarten van een Blazor app van de gebruikersagent.
Zie Component RenderMode voor meer informatie over de Component Tag Helper, inclusief het doorgeven van parameters en configuratie.
Voeg een actie toe aan de Home controller.
Controllers/HomeController.cs
:public IActionResult Blazor() { return View("_Host"); }
Voeg in de
Program.cs
eindpunten een route met lage prioriteit toe voor de controlleractie die de_Host
weergave retourneert:app.MapFallbackToController("Blazor", "Home");
Maak een
Pages
map in de MVC-app en voeg routeerbare onderdelen toe. Het volgende voorbeeld is eenRoutableCounter
onderdeel op basis van hetCounter
onderdeel in de Blazor projectsjablonen.Pages/RoutableCounter.razor
:@page "/routable-counter" <PageTitle>Routable Counter</PageTitle> <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Voer het project uit en navigeer naar het routeerbare
RoutableCounter
onderdeel op/routable-counter
.
Zie de sectie Component-naamruimten voor meer informatie over naamruimten.
Onderdelen van een pagina of weergave weergeven
Deze sectie heeft betrekking op het toevoegen van onderdelen aan pagina's of weergaven, waarbij de onderdelen niet rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Als u een onderdeel van een pagina of weergave wilt weergeven, gebruikt u de Helper voor onderdeeltags.
Render statusgevoelige interactieve componenten
Stateful interactieve componenten kunnen aan een Razor pagina of weergave worden toegevoegd.
Wanneer de pagina of weergave wordt weergegeven:
- Het onderdeel wordt vooraf gerenderd met de pagina of weergave.
- De initiële onderdeelstatus die wordt gebruikt voor prerendering, gaat verloren.
- Er wordt een nieuwe onderdeelstatus gemaakt wanneer de SignalR verbinding tot stand is gebracht.
Op de volgende Razor pagina wordt een Counter
onderdeel weergegeven:
<h1>Razor Page</h1>
<component type="typeof(Counter)" render-mode="ServerPrerendered"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Zie Component Tag Helper in ASP.NET Corevoor meer informatie.
Belangrijk
Het gebruik van een indelingspagina (_Layout.cshtml
) met een Component Tag Helper voor een HeadOutlet onderdeel is vereist voor het beheren <head>
van inhoud, zoals de titel (PageTitle component) van de pagina en andere hoofdelementen (HeadContent onderdeel). Zie Hoofdinhoud beheren in ASP.NET Core-apps Blazorvoor meer informatie.
Niet-inactieve onderdelen weergeven
Op de volgende Razor pagina wordt het Counter
onderdeel statisch weergegeven met een initiële waarde die is opgegeven met behulp van een formulier. Omdat het onderdeel statisch wordt weergegeven, is het onderdeel niet interactief:
<h1>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; }
}
Zie Component Tag Helper in ASP.NET Corevoor meer informatie.
Belangrijk
Het gebruik van een indelingspagina (_Layout.cshtml
) met een Component Tag Helper voor een HeadOutlet onderdeel is vereist voor het beheren <head>
van inhoud, zoals de titel (PageTitle component) van de pagina en andere hoofdelementen (HeadContent onderdeel). Zie Hoofdinhoud beheren in ASP.NET Core-apps Blazorvoor meer informatie.
Onderdeelnaamruimten
Wanneer u een aangepaste map gebruikt om de onderdelen van Razor het project op te slaan, voegt u de naamruimte toe die de map vertegenwoordigt aan de pagina/weergave of aan het _ViewImports.cshtml
bestand. In het volgende voorbeeld:
- Onderdelen worden opgeslagen in de
Components
map van het project. - De
{APP NAMESPACE}
placeholder is de naamruimte van het project.Components
vertegenwoordigt de naam van de map.
@using {APP NAMESPACE}.Components
Het _ViewImports.cshtml
bestand bevindt zich in de Pages
map van een Razor Pagina-app of de Views
map van een MVC-app.
Zie ASP.NET Core Razor-onderdelenvoor meer informatie.
Bewaar vooraf gerenderde toestand
Zonder dat de vooraf gegenereerde status behouden blijft, gaat de status die tijdens het prerenderen wordt gebruikt verloren en moet deze opnieuw worden gemaakt wanneer de app volledig is geladen. Als een toestand asynchroon wordt ingesteld, kan de gebruikersinterface flikkeren omdat de vooraf weergegeven gebruikersinterface wordt vervangen door tijdelijke tijdelijke aanduidingen en vervolgens opnieuw volledig wordt gerenderd.
Om deze problemen op te lossen, biedt Blazor ondersteuning voor het behouden van de status op een voorgerenderde pagina met behulp van de Taghelper voor het bewaren van status van componenten. Voeg de tag van de Tag Helper toe, <persist-component-state />
in de afsluitende </body>
tag.
Pages/_Layout.cshtml
:
<body>
...
<persist-component-state />
</body>
Bepaal welke status moet worden behouden met behulp van de PersistentComponentState service. PersistentComponentState.RegisterOnPersisting registreert een callback om de onderdeelstatus te behouden voordat de app wordt onderbroken. De status wordt opgehaald wanneer de toepassing wordt hervat. Maak de aanroep aan het einde van de initialisatiecode om tijdens het afsluiten van de app een potentiële raceconditie te voorkomen.
In het volgende voorbeeld houdt de WeatherForecastPreserveState
-component de weersverwachtingstatus vast tijdens het voorrenderen en haalt vervolgens de status op om de component te initialiseren. De Helper voor persistente onderdeelstatustags blijft de status van het onderdeel behouden na alle aanroepen van onderdelen.
Pages/WeatherForecastPreserveState.razor
:
@page "/weather-forecast-preserve-state"
@implements IDisposable
@using BlazorSample.Shared
@inject IWeatherForecastService WeatherForecastService
@inject PersistentComponentState ApplicationState
<PageTitle>Weather Forecast</PageTitle>
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[] forecasts = Array.Empty<WeatherForecast>();
private PersistingComponentStateSubscription persistingSubscription;
protected override async Task OnInitializedAsync()
{
if (!ApplicationState.TryTakeFromJson<WeatherForecast[]>(
nameof(forecasts), out var restored))
{
forecasts =
await WeatherForecastService.GetForecastAsync(DateTime.Now);
}
else
{
forecasts = restored!;
}
// Call at the end to avoid a potential race condition at app shutdown
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistData);
}
private Task PersistData()
{
ApplicationState.PersistAsJson(nameof(forecasts), forecasts);
return Task.CompletedTask;
}
void IDisposable.Dispose()
{
persistingSubscription.Dispose();
}
}
Door onderdelen te initialiseren met dezelfde status die tijdens het prerenderen wordt gebruikt, worden dure initialisatiestappen slechts één keer uitgevoerd. De gerenderde gebruikersinterface komt ook overeen met de vooraf gegenereerde gebruikersinterface, dus er treedt geen flikkering op in de browser.
De persistente vooraf gegenereerde status wordt overgebracht naar de client, waar deze wordt gebruikt om de status van het onderdeel te herstellen. ASP.NET Core Data Protection zorgt ervoor dat de gegevens veilig worden overgedragen in Blazor Server apps.
Vooraf weergegeven statusgrootte en SignalR limiet voor berichtgrootte
Een grote vooraf berekende statusgrootte kan groter zijn dan de berichtgrootte limiet van het circuit van BlazorSignalR, wat resulteert in het volgende:
- Het SignalR-circuit initialiseert niet vanwege een fout op de client: Circuit host not initialized.
- De gebruikersinterface voor opnieuw verbinden op de client wordt weergegeven wanneer het circuit mislukt. Herstel is niet mogelijk.
Gebruik van de volgende methoden om het probleem op te lossen:
- Verminder de hoeveelheid gegevens die u in de vooraf weergegeven status plaatst.
- Verhoog de limiet voor SignalR berichtgrootte. WAARSCHUWING: Als u de limiet verhoogt, kan het risico op DoS-aanvallen (Denial of Service) toenemen.
Aanvullende Blazor Server informatiebronnen
- Statusbeheer: prerendering afhandelen
- Razor levenscyclusonderwerpen van componenten die betrekking hebben op prerendering
- Verificatie en autorisatie: Algemene aspecten
- fouten verwerken: vooraf genereren
- Blazor
- Bedreigingsvermindering: Cross-site scripting-aanvallen (XSS)
Prerendering kan seo (Search Engine Optimization) verbeteren door inhoud weer te geven voor het eerste HTTP-antwoord dat zoekmachines kunnen gebruiken om de paginarang te berekenen.
Nadat u het project hebt geconfigureerd, gebruikt u de richtlijnen in de volgende secties, afhankelijk van de vereisten van het project:
- Routeerbare onderdelen: Voor onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen. Volg deze richtlijnen wanneer bezoekers een HTTP-aanvraag in hun browser moeten kunnen indienen voor een onderdeel met een
@page
richtlijn. - Onderdelen weergeven vanaf een pagina of weergave: Voor onderdelen die niet rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen. Volg deze richtlijnen wanneer de app onderdelen insluit in bestaande pagina's of weergaven met de Helper voor onderdeeltags.
Configuratie
Een bestaande Razor Pages- of MVC-app kan Razor componenten integreren in pagina's of weergaven.
In het indelingsbestand van het project:
Voeg de volgende
<base>
tag toe aan het<head>
element inPages/Shared/_Layout.cshtml
(Razor Pagina's) ofViews/Shared/_Layout.cshtml
(MVC):<base href="~/" />
Bij de
href
waarde (het basispad van de app) in het vorige voorbeeld wordt ervan uitgegaan dat de app zich op het hoofd-URL-pad (/
) bevindt. Als de app een subtoepassing is, raadpleegt u het basispad van de ASP.NET Core-app.Voeg direct vóór de
<script>
rendersectie eenblazor.server.js
tag toe voor hetScripts
script.Pages/Shared/_Layout.cshtml
(Razor Pagina's) OfViews/Shared/_Layout.cshtml
(MVC):... <script src="_framework/blazor.server.js"></script> @await RenderSectionAsync("Scripts", required: false) </body>
Het framework voegt het
blazor.server.js
script toe aan de app. U hoeft geen scriptbestand handmatig aan de app toe te voegenblazor.server.js
.
Voeg een importbestand toe aan de hoofdmap van het project met de volgende inhoud. Wijzig de
{APP NAMESPACE}
placeholder naar de naamruimte van het project._Imports.razor
:@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 {APP NAMESPACE}
Registreer Blazor Server dienst in
Startup.ConfigureServices
.In
Startup.cs
:services.AddServerSideBlazor();
Voeg het Blazor Hub-eindpunt toe aan de eindpunten (
app.UseEndpoints
) vanStartup.Configure
.Startup.cs
:endpoints.MapBlazorHub();
Integreer onderdelen in een pagina of weergave. Voeg bijvoorbeeld een
Counter
component toe aan deShared
map van het project.Pages/Shared/Counter.razor
(Razor Pagina's) OfViews/Shared/Counter.razor
(MVC):<h1>Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Razor Pagina's:
Op de
Index
-pagina van een Razor Pagina-app, voeg de naamruimte van hetCounter
onderdeel toe en sluit het onderdeel in op de pagina. Wanneer deIndex
pagina wordt geladen, wordt hetCounter
onderdeel vooraf gegenereerd op de pagina. Vervang in het volgende voorbeeld de{APP NAMESPACE}
tijdelijke aanduiding door de naamruimte van het project.Pages/Index.cshtml
:@page @using {APP NAMESPACE}.Pages.Shared @model IndexModel @{ ViewData["Title"] = "Home page"; } <div> <component type="typeof(Counter)" render-mode="ServerPrerendered" /> </div>
Vervang in het voorgaande voorbeeld de
{APP NAMESPACE}
tijdelijke aanduiding door de naamruimte van de app.MVC:
Voeg in de projectweergave
Index
van een MVC-app de naamruimte van hetCounter
onderdeel toe en sluit het onderdeel in de weergave in. Wanneer deIndex
weergave wordt geladen, wordt hetCounter
onderdeel vooraf op de pagina weergegeven. Vervang in het volgende voorbeeld de{APP NAMESPACE}
tijdelijke aanduiding door de naamruimte van het project.Views/Home/Index.cshtml
:@using {APP NAMESPACE}.Views.Shared @{ ViewData["Title"] = "Home Page"; } <div> <component type="typeof(Counter)" render-mode="ServerPrerendered" /> </div>
Zie de onderdelen weergeven van een pagina of weergavesectie voor meer informatie.
Routeerbare onderdelen gebruiken in een Razor Pages-app
Deze sectie heeft betrekking op het toevoegen van onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Om routeerbare Razor componenten in Razor Pages-apps te ondersteunen:
Volg de richtlijnen in de sectie Configuratie .
Voeg een
App
component toe aan de hoofdmap van het project met de volgende inhoud.App.razor
:@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>
Notitie
Met de release van .NET 5.0.1 en voor eventuele extra releases van 5.x bevat het
Router
onderdeel dePreferExactMatches
parameter die is ingesteld op@true
. Zie Migreren van ASP.NET Core 3.1 naar .NET 5 voor meer informatie.Voeg een
_Host
pagina toe aan het project met de volgende inhoud.Pages/_Host.cshtml
:@page "/blazor" @{ Layout = "_Layout"; } <app> <component type="typeof(App)" render-mode="ServerPrerendered" /> </app>
Onderdelen gebruiken het gedeelde
_Layout.cshtml
bestand voor hun indeling.Met RenderMode configureert u of het
App
onderdeel:- Wordt voorgerenderd in de pagina.
- Wordt weergegeven als statische HTML op de pagina of als deze de benodigde informatie bevat voor het opstarten van een Blazor app van de gebruikersagent.
Zie Component RenderMode voor meer informatie over de Component Tag Helper, inclusief het doorgeven van parameters en configuratie.
Voeg in de
Startup.Configure
eindpunten vanStartup.cs
een route met lage prioriteit toe voor de_Host
pagina als het laatste eindpunt.endpoints.MapFallbackToPage("/_Host");
In het volgende voorbeeld ziet u de toegevoegde regel in de eindpuntconfiguratie van een typische app:
app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapBlazorHub(); endpoints.MapFallbackToPage("/_Host"); });
Routeerbare onderdelen toevoegen aan het project.
Pages/RoutableCounter.razor
:@page "/routable-counter" <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Voer het project uit en navigeer naar het routeerbare
RoutableCounter
onderdeel op/routable-counter
.
Zie de sectie Component-naamruimten voor meer informatie over naamruimten.
Routeerbare onderdelen gebruiken in een MVC-app
Deze sectie heeft betrekking op het toevoegen van onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Routeerbare Razor onderdelen in MVC-apps ondersteunen:
Volg de richtlijnen in de sectie Configuratie .
Voeg een
App
component toe aan de hoofdmap van het project met de volgende inhoud.App.razor
:@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>
Notitie
Met de release van .NET 5.0.1 en voor eventuele extra releases van 5.x bevat het
Router
onderdeel dePreferExactMatches
parameter die is ingesteld op@true
. Zie Migreren van ASP.NET Core 3.1 naar .NET 5 voor meer informatie.Voeg een
_Host
weergave toe aan het project met de volgende inhoud.Views/Home/_Host.cshtml
:@{ Layout = "_Layout"; } <app> <component type="typeof(App)" render-mode="ServerPrerendered" /> </app>
Onderdelen gebruiken het gedeelde
_Layout.cshtml
bestand voor hun indeling.Met RenderMode configureert u of het
App
onderdeel:- Wordt voorgerenderd in de pagina.
- Wordt weergegeven als statische HTML op de pagina of als deze de benodigde informatie bevat voor het opstarten van een Blazor app van de gebruikersagent.
Zie Component RenderMode voor meer informatie over de Component Tag Helper, inclusief het doorgeven van parameters en configuratie.
Voeg een actie toe aan de Home controller.
Controllers/HomeController.cs
:public IActionResult Blazor() { return View("_Host"); }
Voeg in de
Startup.Configure
eindpunten vanStartup.cs
, een route met lage prioriteit toe voor de controlleractie die de_Host
weergave retourneert:endpoints.MapFallbackToController("Blazor", "Home");
In het volgende voorbeeld ziet u de toegevoegde regel in de eindpuntconfiguratie van een typische app:
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapBlazorHub(); endpoints.MapFallbackToController("Blazor", "Home"); });
Routeerbare onderdelen toevoegen aan het project.
Pages/RoutableCounter.razor
:@page "/routable-counter" <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Voer het project uit en navigeer naar het routeerbare
RoutableCounter
onderdeel op/routable-counter
.
Zie de sectie Component-naamruimten voor meer informatie over naamruimten.
Onderdelen van een pagina of weergave weergeven
Deze sectie heeft betrekking op het toevoegen van onderdelen aan pagina's of weergaven, waarbij de onderdelen niet rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Als u een onderdeel van een pagina of weergave wilt weergeven, gebruikt u de Helper voor onderdeeltags.
Render statusgevoelige interactieve componenten
Stateful interactieve componenten kunnen aan een Razor pagina of weergave worden toegevoegd.
Wanneer de pagina of weergave wordt weergegeven:
- Het onderdeel wordt vooraf gerenderd met de pagina of weergave.
- De initiële onderdeelstatus die wordt gebruikt voor prerendering, gaat verloren.
- Er wordt een nieuwe onderdeelstatus gemaakt wanneer de SignalR verbinding tot stand is gebracht.
Op de volgende Razor pagina wordt een Counter
onderdeel weergegeven:
<h1>My Razor Page</h1>
<component type="typeof(Counter)" render-mode="ServerPrerendered"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Zie Component Tag Helper in ASP.NET Corevoor meer informatie.
Niet-inactieve onderdelen weergeven
Op de volgende Razor pagina wordt het Counter
onderdeel statisch weergegeven met een initiële waarde die is opgegeven met behulp van een formulier. Omdat het onderdeel statisch wordt weergegeven, is het onderdeel niet interactief:
<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; }
}
Zie Component Tag Helper in ASP.NET Corevoor meer informatie.
Onderdeelnaamruimten
Wanneer u een aangepaste map gebruikt om de onderdelen van Razor het project op te slaan, voegt u de naamruimte toe die de map vertegenwoordigt aan de pagina/weergave of aan het _ViewImports.cshtml
bestand. In het volgende voorbeeld:
- Onderdelen worden opgeslagen in de
Components
map van het project. - De
{APP NAMESPACE}
placeholder is de naamruimte van het project.Components
vertegenwoordigt de naam van de map.
@using {APP NAMESPACE}.Components
Het _ViewImports.cshtml
bestand bevindt zich in de Pages
map van een Razor Pagina-app of de Views
map van een MVC-app.
Zie ASP.NET Core Razor-onderdelenvoor meer informatie.
Vooraf weergegeven statusgrootte en SignalR limiet voor berichtgrootte
Een grote vooraf berekende statusgrootte kan groter zijn dan de berichtgrootte limiet van het circuit van BlazorSignalR, wat resulteert in het volgende:
- Het SignalR-circuit initialiseert niet vanwege een fout op de client: Circuit host not initialized.
- De gebruikersinterface voor opnieuw verbinden op de client wordt weergegeven wanneer het circuit mislukt. Herstel is niet mogelijk.
Gebruik van de volgende methoden om het probleem op te lossen:
- Verminder de hoeveelheid gegevens die u in de vooraf weergegeven status plaatst.
- Verhoog de limiet voor SignalR berichtgrootte. WAARSCHUWING: Als u de limiet verhoogt, kan het risico op DoS-aanvallen (Denial of Service) toenemen.
Aanvullende Blazor Server informatiebronnen
- Statusbeheer: prerendering afhandelen
- Razor levenscyclusonderwerpen van componenten die betrekking hebben op prerendering
- Verificatie en autorisatie: Algemene aspecten
- fouten verwerken: vooraf genereren
- Blazor
- Bedreigingsvermindering: Cross-site scripting-aanvallen (XSS)
Razor-componenten kunnen worden geïntegreerd in Razor Pages of MVC-apps. Wanneer de pagina of weergave wordt gerenderd, kunnen componenten tegelijkertijd worden voorgeladen.
Prerendering kan seo (Search Engine Optimization) verbeteren door inhoud weer te geven voor het eerste HTTP-antwoord dat zoekmachines kunnen gebruiken om de paginarang te berekenen.
Nadat u het project hebt geconfigureerd, gebruikt u de richtlijnen in de volgende secties, afhankelijk van de vereisten van het project:
- Routeerbare onderdelen: Voor onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen. Volg deze richtlijnen wanneer bezoekers een HTTP-aanvraag in hun browser moeten kunnen indienen voor een onderdeel met een
@page
richtlijn. - Onderdelen weergeven vanaf een pagina of weergave: Voor onderdelen die niet rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen. Volg deze richtlijnen wanneer de app onderdelen insluit in bestaande pagina's of weergaven met de Helper voor onderdeeltags.
Configuratie
Een bestaande Razor Pages- of MVC-app kan Razor componenten integreren in pagina's of weergaven.
In het indelingsbestand van het project:
Voeg de volgende
<base>
tag toe aan het<head>
element inPages/Shared/_Layout.cshtml
(Razor Pagina's) ofViews/Shared/_Layout.cshtml
(MVC):+ <base href="~/" />
Bij de
href
waarde (het basispad van de app) in het vorige voorbeeld wordt ervan uitgegaan dat de app zich op het hoofd-URL-pad (/
) bevindt. Als de app een subtoepassing is, raadpleegt u het basispad van de ASP.NET Core-app.Voeg direct vóór de
<script>
rendersectie eenblazor.server.js
tag toe voor hetScripts
script.Pages/Shared/_Layout.cshtml
(Razor Pagina's) OfViews/Shared/_Layout.cshtml
(MVC):... <script src="_framework/blazor.server.js"></script> @await RenderSectionAsync("Scripts", required: false) </body>
Het framework voegt het
blazor.server.js
script toe aan de app. U hoeft geen scriptbestand handmatig aan de app toe te voegenblazor.server.js
.
Voeg een importbestand toe aan de hoofdmap van het project met de volgende inhoud. Wijzig de
{APP NAMESPACE}
placeholder naar de naamruimte van het project._Imports.razor
:@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 {APP NAMESPACE}
Registreer Blazor Server dienst in
Startup.ConfigureServices
.Startup.cs
:services.AddServerSideBlazor();
Voeg het Blazor Hub-eindpunt toe aan de eindpunten (
app.UseEndpoints
) vanStartup.Configure
.Startup.cs
:endpoints.MapBlazorHub();
Integreer onderdelen in een pagina of weergave. Voeg bijvoorbeeld een
Counter
component toe aan deShared
map van het project.Pages/Shared/Counter.razor
(Razor Pagina's) OfViews/Shared/Counter.razor
(MVC):<h1>Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Razor Pagina's:
Op de
Index
-pagina van een Razor Pagina-app, voeg de naamruimte van hetCounter
onderdeel toe en sluit het onderdeel in op de pagina. Wanneer deIndex
pagina wordt geladen, wordt hetCounter
onderdeel vooraf gegenereerd op de pagina. Vervang in het volgende voorbeeld de{APP NAMESPACE}
tijdelijke aanduiding door de naamruimte van het project.Pages/Index.cshtml
:@page @using {APP NAMESPACE}.Pages.Shared @model IndexModel @{ ViewData["Title"] = "Home page"; } <div> <component type="typeof(Counter)" render-mode="ServerPrerendered" /> </div>
Vervang in het voorgaande voorbeeld de
{APP NAMESPACE}
tijdelijke aanduiding door de naamruimte van de app.MVC:
Voeg in de projectweergave
Index
van een MVC-app de naamruimte van hetCounter
onderdeel toe en sluit het onderdeel in de weergave in. Wanneer deIndex
weergave wordt geladen, wordt hetCounter
onderdeel vooraf op de pagina weergegeven. Vervang in het volgende voorbeeld de{APP NAMESPACE}
tijdelijke aanduiding door de naamruimte van het project.Views/Home/Index.cshtml
:@using {APP NAMESPACE}.Views.Shared @{ ViewData["Title"] = "Home Page"; } <div> <component type="typeof(Counter)" render-mode="ServerPrerendered" /> </div>
Zie de onderdelen weergeven van een pagina of weergavesectie voor meer informatie.
Routeerbare onderdelen gebruiken in een Razor Pages-app
Deze sectie heeft betrekking op het toevoegen van onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Om routeerbare Razor componenten in Razor Pages-apps te ondersteunen:
Volg de richtlijnen in de sectie Configuratie .
Voeg een
App
component toe aan de hoofdmap van het project met de volgende inhoud.App.razor
:@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>
Voeg een
_Host
pagina toe aan het project met de volgende inhoud.Pages/_Host.cshtml
:@page "/blazor" @{ Layout = "_Layout"; } <app> <component type="typeof(App)" render-mode="ServerPrerendered" /> </app>
Onderdelen gebruiken het gedeelde
_Layout.cshtml
bestand voor hun indeling.Met RenderMode configureert u of het
App
onderdeel:- Wordt voorgerenderd in de pagina.
- Wordt weergegeven als statische HTML op de pagina of als deze de benodigde informatie bevat voor het opstarten van een Blazor app van de gebruikersagent.
Zie Component RenderMode voor meer informatie over de Component Tag Helper, inclusief het doorgeven van parameters en configuratie.
Voeg in de
Startup.Configure
eindpunten vanStartup.cs
een route met lage prioriteit toe voor de_Host
pagina als het laatste eindpunt.endpoints.MapFallbackToPage("/_Host");
In het volgende voorbeeld ziet u de toegevoegde regel in de eindpuntconfiguratie van een typische app:
app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapBlazorHub(); endpoints.MapFallbackToPage("/_Host"); });
Routeerbare onderdelen toevoegen aan het project.
Pages/RoutableCounter.razor
:@page "/routable-counter" <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Voer het project uit en navigeer naar het routeerbare
RoutableCounter
onderdeel op/routable-counter
.
Zie de sectie Component-naamruimten voor meer informatie over naamruimten.
Routeerbare onderdelen gebruiken in een MVC-app
Deze sectie heeft betrekking op het toevoegen van onderdelen die rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Routeerbare Razor onderdelen in MVC-apps ondersteunen:
Volg de richtlijnen in de sectie Configuratie .
Voeg een
App
component toe aan de hoofdmap van het project met de volgende inhoud.App.razor
:@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>
Voeg een
_Host
weergave toe aan het project met de volgende inhoud.Views/Home/_Host.cshtml
:@{ Layout = "_Layout"; } <app> <component type="typeof(App)" render-mode="ServerPrerendered" /> </app>
Onderdelen gebruiken het gedeelde
_Layout.cshtml
bestand voor hun indeling.Met RenderMode configureert u of het
App
onderdeel:- Wordt voorgerenderd in de pagina.
- Wordt weergegeven als statische HTML op de pagina of als deze de benodigde informatie bevat voor het opstarten van een Blazor app van de gebruikersagent.
Zie Component RenderMode voor meer informatie over de Component Tag Helper, inclusief het doorgeven van parameters en configuratie.
Voeg een actie toe aan de Home controller.
Controllers/HomeController.cs
:public IActionResult Blazor() { return View("_Host"); }
Voeg in de
Startup.Configure
eindpunten vanStartup.cs
, een route met lage prioriteit toe voor de controlleractie die de_Host
weergave retourneert:endpoints.MapFallbackToController("Blazor", "Home");
In het volgende voorbeeld ziet u de toegevoegde regel in de eindpuntconfiguratie van een typische app:
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapBlazorHub(); endpoints.MapFallbackToController("Blazor", "Home"); });
Routeerbare onderdelen toevoegen aan het project.
Pages/RoutableCounter.razor
:@page "/routable-counter" <h1>Routable Counter</h1> <p>Current count: @currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } }
Voer het project uit en navigeer naar het routeerbare
RoutableCounter
onderdeel op/routable-counter
.
Zie de sectie Component-naamruimten voor meer informatie over naamruimten.
Onderdelen van een pagina of weergave weergeven
Deze sectie heeft betrekking op het toevoegen van onderdelen aan pagina's of weergaven, waarbij de onderdelen niet rechtstreeks routeerbaar zijn vanuit gebruikersaanvragen.
Als u een onderdeel van een pagina of weergave wilt weergeven, gebruikt u de Helper voor onderdeeltags.
Render statusgevoelige interactieve componenten
Stateful interactieve componenten kunnen aan een Razor pagina of weergave worden toegevoegd.
Wanneer de pagina of weergave wordt weergegeven:
- Het onderdeel wordt vooraf gerenderd met de pagina of weergave.
- De initiële onderdeelstatus die wordt gebruikt voor prerendering, gaat verloren.
- Er wordt een nieuwe onderdeelstatus gemaakt wanneer de SignalR verbinding tot stand is gebracht.
Op de volgende Razor pagina wordt een Counter
onderdeel weergegeven:
<h1>My Razor Page</h1>
<component type="typeof(Counter)" render-mode="ServerPrerendered"
param-InitialValue="InitialValue" />
@functions {
[BindProperty(SupportsGet=true)]
public int InitialValue { get; set; }
}
Zie Component Tag Helper in ASP.NET Corevoor meer informatie.
Niet-inactieve onderdelen weergeven
Op de volgende Razor pagina wordt het Counter
onderdeel statisch weergegeven met een initiële waarde die is opgegeven met behulp van een formulier. Omdat het onderdeel statisch wordt weergegeven, is het onderdeel niet interactief:
<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; }
}
Zie Component Tag Helper in ASP.NET Corevoor meer informatie.
Onderdeelnaamruimten
Wanneer u een aangepaste map gebruikt om de onderdelen van Razor het project op te slaan, voegt u de naamruimte toe die de map vertegenwoordigt aan de pagina/weergave of aan het _ViewImports.cshtml
bestand. In het volgende voorbeeld:
- Onderdelen worden opgeslagen in de
Components
map van het project. - De
{APP NAMESPACE}
placeholder is de naamruimte van het project.Components
vertegenwoordigt de naam van de map.
@using {APP NAMESPACE}.Components
Het _ViewImports.cshtml
bestand bevindt zich in de Pages
map van een Razor Pagina-app of de Views
map van een MVC-app.
Zie ASP.NET Core Razor-onderdelenvoor meer informatie.
Vooraf weergegeven statusgrootte en SignalR limiet voor berichtgrootte
Een grote vooraf berekende statusgrootte kan groter zijn dan de berichtgrootte limiet van het circuit van BlazorSignalR, wat resulteert in het volgende:
- Het SignalR-circuit initialiseert niet vanwege een fout op de client: Circuit host not initialized.
- De gebruikersinterface voor opnieuw verbinden op de client wordt weergegeven wanneer het circuit mislukt. Herstel is niet mogelijk.
Gebruik van de volgende methoden om het probleem op te lossen:
- Verminder de hoeveelheid gegevens die u in de vooraf weergegeven status plaatst.
- Verhoog de limiet voor SignalR berichtgrootte. WAARSCHUWING: Als u de limiet verhoogt, kan het risico op DoS-aanvallen (Denial of Service) toenemen.
Aanvullende Blazor Server informatiebronnen
- Statusbeheer: prerendering afhandelen
- Razor levenscyclusonderwerpen van componenten die betrekking hebben op prerendering
- Verificatie en autorisatie: Algemene aspecten
- fouten verwerken: vooraf genereren
- Blazor
- Bedreigingsvermindering: Cross-site scripting-aanvallen (XSS)