evento
Campeonato Mundial do Power BI DataViz
14/02, 16 - 31/03, 16
Com 4 chances de participar, você pode ganhar um pacote de conferência e chegar ao LIVE Grand Finale em Las Vegas
Mais informaçõesEste browser já não é suportado.
Atualize para o Microsoft Edge para tirar partido das mais recentes funcionalidades, atualizações de segurança e de suporte técnico.
Nota
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Aviso
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Importante
Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
Blazor WebAssembly O desempenho de arranque da aplicação pode ser melhorado adiando o carregamento dos assemblies criados pelo desenvolvedor até serem necessários, o que se chama de carregamento lento.
As seções iniciais deste artigo abrangem a configuração do aplicativo. Para uma demonstração de trabalho, consulte a seção Exemplo completo no final deste artigo.
Este artigo aplica-se apenas a aplicações Blazor WebAssembly. O carregamento preguiçoso de assembly não beneficia as aplicações do lado do servidor, porque as aplicações renderizadas pelo servidor não transferem assemblies para o cliente.
O carregamento lento não deve ser usado para assemblies de tempo de execução principais, que podem ser removidos na publicação e indisponíveis no cliente quando a aplicação é carregada.
Os arquivos de montagem usam o formato de empacotamento Webcil para assemblies .NET com uma extensão de arquivo .wasm
.
Ao longo do artigo, o marcador de posição {FILE EXTENSION}
representa "wasm
".
Os arquivos Assembly são baseados em bibliotecas Dynamic-Link (DLLs) com uma extensão de arquivo .dll
.
Ao longo do artigo, o marcador de posição {FILE EXTENSION}
representa "dll
".
Marque assemblies para carregamento lento no ficheiro de projeto da aplicação (.csproj
) usando o item BlazorWebAssemblyLazyLoad
. Use o nome do assembly com extensão de arquivo. A estrutura Blazor impede que o assembly seja carregado na inicialização do aplicativo.
<ItemGroup>
<BlazorWebAssemblyLazyLoad Include="{ASSEMBLY NAME}.{FILE EXTENSION}" />
</ItemGroup>
O marcador {ASSEMBLY NAME}
é o nome do assembly e o marcador {FILE EXTENSION}
é a extensão do ficheiro. A extensão do arquivo é necessária.
Inclua um item BlazorWebAssemblyLazyLoad
para cada montagem. Se um assembly tiver dependências, inclua uma entrada BlazorWebAssemblyLazyLoad
para cada dependência.
A estrutura Blazor regista automaticamente um serviço singleton para carregamento preguiçoso de assemblies em aplicações Blazor WebAssembly do lado do cliente, LazyAssemblyLoader. O método LazyAssemblyLoader.LoadAssembliesAsync:
Nota
Orientação para soluções hospedadas
Blazorcomponente Router designa os conjuntos que Blazor procura componentes roteáveis e também é responsável por renderizar o componente para a rota onde o usuário navega. O método OnNavigateAsync
do componente Router é usado em conjunto com o carregamento lento para carregar os assemblies corretos para pontos de extremidade solicitados por um usuário.
A lógica é implementada dentro OnNavigateAsync para determinar os assemblies a serem carregados com LazyAssemblyLoader. As opções de como estruturar a lógica incluem:
No exemplo a seguir:
AssemblyLoader
).{PATH}
é o caminho onde a lista de assemblagens deve ser carregada. O exemplo usa uma verificação condicional para um único caminho que carrega um único conjunto de assemblies.{LIST OF ASSEMBLIES}
é uma lista separada por vírgulas de nomes de ficheiros de assemblagem, incluindo as suas extensões de ficheiro (por exemplo, "Assembly1.{FILE EXTENSION}", "Assembly2.{FILE EXTENSION}"
).
App.razor
:
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@using Microsoft.Extensions.Logging
@inject LazyAssemblyLoader AssemblyLoader
@inject ILogger<App> Logger
<Router AppAssembly="typeof(App).Assembly"
OnNavigateAsync="OnNavigateAsync">
...
</Router>
@code {
private async Task OnNavigateAsync(NavigationContext args)
{
try
{
if (args.Path == "{PATH}")
{
var assemblies = await AssemblyLoader.LoadAssembliesAsync(
[ {LIST OF ASSEMBLIES} ]);
}
}
catch (Exception ex)
{
Logger.LogError("Error: {Message}", ex.Message);
}
}
}
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@using Microsoft.Extensions.Logging
@inject LazyAssemblyLoader AssemblyLoader
@inject ILogger<App> Logger
<Router AppAssembly="typeof(App).Assembly"
OnNavigateAsync="OnNavigateAsync">
...
</Router>
@code {
private async Task OnNavigateAsync(NavigationContext args)
{
try
{
if (args.Path == "{PATH}")
{
var assemblies = await AssemblyLoader.LoadAssembliesAsync(
new[] { {LIST OF ASSEMBLIES} });
}
}
catch (Exception ex)
{
Logger.LogError("Error: {Message}", ex.Message);
}
}
}
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@using Microsoft.Extensions.Logging
@inject LazyAssemblyLoader AssemblyLoader
@inject ILogger<App> Logger
<Router AppAssembly="typeof(Program).Assembly"
OnNavigateAsync="OnNavigateAsync">
...
</Router>
@code {
private async Task OnNavigateAsync(NavigationContext args)
{
try
{
if (args.Path == "{PATH}")
{
var assemblies = await AssemblyLoader.LoadAssembliesAsync(
new[] { {LIST OF ASSEMBLIES} });
}
}
catch (Exception ex)
{
Logger.LogError("Error: {Message}", ex.Message);
}
}
}
Nota
O exemplo anterior não mostra o conteúdo da marcação Razor do componente Router (...
). Para obter uma demonstração com código completo, consulte a seção Exemplo Completo deste artigo.
Nota
Com o lançamento do ASP.NET Core 5.0.1 e para quaisquer versões adicionais do 5.x, o componente Router
inclui o parâmetro PreferExactMatches
definido como @true
. Para obter mais informações, consulte migrar do ASP.NET Core 3.1 para o 5.0.
Quando a lista de assemblies inclui componentes roteáveis, a lista de assemblies de um determinado caminho é passada para a coleção AdditionalAssemblies do componente Router.
No exemplo a seguir:
lazyLoadedAssemblies
transmite a lista de montagem para AdditionalAssemblies. A estrutura pesquisa rotas nos assemblies e atualiza a coleção de rotas se novas rotas forem encontradas. Para acessar o tipo de Assembly, o namespace para System.Reflection está incluído na parte superior do arquivo App.razor
.{PATH}
é o caminho onde a lista de conjuntos deve ser carregada. O exemplo usa uma verificação condicional para um único caminho que carrega um único conjunto de assemblies.{LIST OF ASSEMBLIES}
é a lista separada por vírgulas de nomes de ficheiros assembly, incluindo as suas extensões (por exemplo, "Assembly1.{FILE EXTENSION}", "Assembly2.{FILE EXTENSION}"
).
App.razor
:
@using System.Reflection
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@using Microsoft.Extensions.Logging
@inject ILogger<App> Logger
@inject LazyAssemblyLoader AssemblyLoader
<Router AppAssembly="typeof(App).Assembly"
AdditionalAssemblies="lazyLoadedAssemblies"
OnNavigateAsync="OnNavigateAsync">
...
</Router>
@code {
private List<Assembly> lazyLoadedAssemblies = [];
private async Task OnNavigateAsync(NavigationContext args)
{
try
{
if (args.Path == "{PATH}")
{
var assemblies = await AssemblyLoader.LoadAssembliesAsync(
[ {LIST OF ASSEMBLIES} ]);
lazyLoadedAssemblies.AddRange(assemblies);
}
}
catch (Exception ex)
{
Logger.LogError("Error: {Message}", ex.Message);
}
}
}
@using System.Reflection
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@using Microsoft.Extensions.Logging
@inject ILogger<App> Logger
@inject LazyAssemblyLoader AssemblyLoader
<Router AppAssembly="typeof(App).Assembly"
AdditionalAssemblies="lazyLoadedAssemblies"
OnNavigateAsync="OnNavigateAsync">
...
</Router>
@code {
private List<Assembly> lazyLoadedAssemblies = new();
private async Task OnNavigateAsync(NavigationContext args)
{
try
{
if (args.Path == "{PATH}")
{
var assemblies = await AssemblyLoader.LoadAssembliesAsync(
new[] { {LIST OF ASSEMBLIES} });
lazyLoadedAssemblies.AddRange(assemblies);
}
}
catch (Exception ex)
{
Logger.LogError("Error: {Message}", ex.Message);
}
}
}
@using System.Reflection
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@using Microsoft.Extensions.Logging
@inject ILogger<App> Logger
@inject LazyAssemblyLoader AssemblyLoader
<Router AppAssembly="typeof(Program).Assembly"
AdditionalAssemblies="lazyLoadedAssemblies"
OnNavigateAsync="OnNavigateAsync">
...
</Router>
@code {
private List<Assembly> lazyLoadedAssemblies = new List<Assembly>();
private async Task OnNavigateAsync(NavigationContext args)
{
try
{
if (args.Path == "{PATH}")
{
var assemblies = await AssemblyLoader.LoadAssembliesAsync(
new[] { {LIST OF ASSEMBLIES} });
lazyLoadedAssemblies.AddRange(assemblies);
}
}
catch (Exception ex)
{
Logger.LogError("Error: {Message}", ex.Message);
}
}
}
Nota
O exemplo anterior não mostra o conteúdo da marcação Razor do componente Router (...
). Para obter uma demonstração com código completo, consulte a seção Exemplo Completo deste artigo.
Nota
Com o lançamento do ASP.NET Core 5.0.1 e para quaisquer versões adicionais do 5.x, o componente Router
inclui o parâmetro PreferExactMatches
definido como @true
. Para obter mais informações, consulte migrar do ASP.NET Core 3.1 para o 5.0.
Para obter mais informações, consulte ASP.NET Core Blazor roteamento e navegação.
Ao carregar assemblies, o que pode levar vários segundos, o componente Router pode indicar ao usuário que uma transição de página está ocorrendo com a propriedade Navigating do roteador.
Para obter mais informações, consulte ASP.NET Core Blazor roteamento e navegação.
O objeto NavigationContext passado para a função de retorno OnNavigateAsync contém um CancellationToken que é definido quando ocorre um novo evento de navegação. O retorno de chamada OnNavigateAsync deve ser lançado quando o token de cancelamento estiver definido para evitar continuar a executar o retorno de chamada OnNavigateAsync em uma navegação desatualizada.
Para obter mais informações, consulte ASP.NET Core Blazor roteamento e navegação.
O carregador de recursos depende dos nomes de assembly definidos no arquivo blazor.boot.json
. Se assemblies forem renomeados, os nomes de assembly usados em um retorno de chamada OnNavigateAsync e os nomes de assembly no arquivo blazor.boot.json
estarão fora de sincronia.
Para corrigir esta situação:
Production
ao determinar quais nomes de assembly usar.A implementação de carregamento lento da estrutura suporta carregamento lento com prérenderização numa solução de Blazor WebAssemblyhospedada. Durante a pré-renderização, todos os conjuntos, incluindo aqueles marcados para carregamento lento, são considerados carregados. Registre manualmente o serviço de LazyAssemblyLoader no projeto Server.
Na parte superior do arquivo de Program.cs
do projeto Server, adicione o namespace para Microsoft.AspNetCore.Components.WebAssembly.Services:
using Microsoft.AspNetCore.Components.WebAssembly.Services;
Em Program.cs
do projeto Server, registe o serviço:
builder.Services.AddScoped<LazyAssemblyLoader>();
Na parte superior do arquivo de Startup.cs
do projeto Server, adicione o namespace para Microsoft.AspNetCore.Components.WebAssembly.Services:
using Microsoft.AspNetCore.Components.WebAssembly.Services;
Em Startup.ConfigureServices
(Startup.cs
) do projeto Server, registe o serviço:
services.AddScoped<LazyAssemblyLoader>();
A demonstração nesta seção:
GrantImaharaRobotControls.{FILE EXTENSION}
) como uma biblioteca de classes Razor (RCL) que inclui um componente Robot
(Robot.razor
com um modelo de rota de /robot
).Robot
quando a URL /robot
é solicitada pelo usuário.Crie um aplicativo Blazor WebAssembly autônomo para demonstrar o carregamento lento de um assembly da biblioteca de classes Razor. Nomeie o projeto LazyLoadTest
.
Adicione um projeto de biblioteca de classes ASP.NET Core à solução:
GrantImaharaRobotControls
. Não marque a caixa de seleção páginas e exibições de suporte.dotnet new razorclasslib -o GrantImaharaRobotControls
a partir de um prompt de comando. A opção -o|--output
cria uma pasta e nomeia o projeto GrantImaharaRobotControls
.Crie uma classe HandGesture
na RCL com um método ThumbUp
que, hipoteticamente, faz com que um robô execute um gesto de polegar para cima. O método aceita um argumento para o eixo, Left
ou Right
, como um enum
. O método retorna true
no sucesso.
HandGesture.cs
:
using Microsoft.Extensions.Logging;
namespace GrantImaharaRobotControls;
public static class HandGesture
{
public static bool ThumbUp(Axis axis, ILogger logger)
{
logger.LogInformation("Thumb up gesture. Axis: {Axis}", axis);
// Code to make robot perform gesture
return true;
}
}
public enum Axis { Left, Right }
using Microsoft.Extensions.Logging;
namespace GrantImaharaRobotControls
{
public static class HandGesture
{
public static bool ThumbUp(Axis axis, ILogger logger)
{
logger.LogInformation("Thumb up gesture. Axis: {Axis}", axis);
// Code to make robot perform gesture
return true;
}
}
public enum Axis { Left, Right }
}
Adicione o seguinte componente à raiz do projeto RCL. O componente permite que o usuário envie uma solicitação de gesto de polegar para cima com a mão esquerda ou direita.
Robot.razor
:
@page "/robot"
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.Extensions.Logging
@inject ILogger<Robot> Logger
<h1>Robot</h1>
<EditForm FormName="RobotForm" Model="robotModel" OnValidSubmit="HandleValidSubmit">
<InputRadioGroup @bind-Value="robotModel.AxisSelection">
@foreach (var entry in Enum.GetValues<Axis>())
{
<InputRadio Value="entry" />
<text> </text>@entry<br>
}
</InputRadioGroup>
<button type="submit">Submit</button>
</EditForm>
<p>
@message
</p>
@code {
private RobotModel robotModel = new() { AxisSelection = Axis.Left };
private string? message;
private void HandleValidSubmit()
{
Logger.LogInformation("HandleValidSubmit called");
var result = HandGesture.ThumbUp(robotModel.AxisSelection, Logger);
message = $"ThumbUp returned {result} at {DateTime.Now}.";
}
public class RobotModel
{
public Axis AxisSelection { get; set; }
}
}
@page "/robot"
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.Extensions.Logging
@inject ILogger<Robot> Logger
<h1>Robot</h1>
<EditForm Model="robotModel" OnValidSubmit="HandleValidSubmit">
<InputRadioGroup @bind-Value="robotModel.AxisSelection">
@foreach (var entry in Enum.GetValues<Axis>())
{
<InputRadio Value="entry" />
<text> </text>@entry<br>
}
</InputRadioGroup>
<button type="submit">Submit</button>
</EditForm>
<p>
@message
</p>
@code {
private RobotModel robotModel = new() { AxisSelection = Axis.Left };
private string? message;
private void HandleValidSubmit()
{
Logger.LogInformation("HandleValidSubmit called");
var result = HandGesture.ThumbUp(robotModel.AxisSelection, Logger);
message = $"ThumbUp returned {result} at {DateTime.Now}.";
}
public class RobotModel
{
public Axis AxisSelection { get; set; }
}
}
@page "/robot"
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.Extensions.Logging
@inject ILogger<Robot> Logger
<h1>Robot</h1>
<EditForm Model="robotModel" OnValidSubmit="HandleValidSubmit">
<InputRadioGroup @bind-Value="robotModel.AxisSelection">
@foreach (var entry in (Axis[])Enum
.GetValues(typeof(Axis)))
{
<InputRadio Value="entry" />
<text> </text>@entry<br>
}
</InputRadioGroup>
<button type="submit">Submit</button>
</EditForm>
<p>
@message
</p>
@code {
private RobotModel robotModel = new RobotModel() { AxisSelection = Axis.Left };
private string message;
private void HandleValidSubmit()
{
Logger.LogInformation("HandleValidSubmit called");
var result = HandGesture.ThumbUp(robotModel.AxisSelection, Logger);
message = $"ThumbUp returned {result} at {DateTime.Now}.";
}
public class RobotModel
{
public Axis AxisSelection { get; set; }
}
}
No projeto LazyLoadTest
, crie uma referência de projeto para o GrantImaharaRobotControls
RCL:
LazyLoadTest
e selecione Adicionar>Referência de Projeto para adicionar uma referência de projeto ao RCL GrantImaharaRobotControls
.dotnet add reference {PATH}
em um shell de comando da pasta do projeto. O marcador {PATH}
é o caminho para o projeto RCL.Especifique o assembly da RCL para carregamento lento no arquivo de projeto do aplicativo LazyLoadTest
(.csproj
):
<ItemGroup>
<BlazorWebAssemblyLazyLoad Include="GrantImaharaRobotControls.{FILE EXTENSION}" />
</ItemGroup>
O componente Router a seguir demonstra o carregamento da assemblagem GrantImaharaRobotControls.{FILE EXTENSION}
quando o utilizador navega para /robot
. Substitua o componente App
padrão do aplicativo pelo componente App
a seguir.
Durante as transições de página, uma mensagem com estilo é exibida para o usuário com o elemento <Navigating>
. Para obter mais informações, consulte a secção Interação do usuário com o conteúdo <Navigating>
na secção.
O conjunto é atribuído a AdditionalAssemblies, o que faz com que o roteador procure componentes roteáveis no conjunto, onde encontra o componente Robot
. A rota do componente Robot
é adicionada à coleção de rotas do aplicativo. Para obter mais informações, consulte o artigo ASP.NET Core Blazor roteamento e navegação e a seção Assembléias que incluem componentes roteáveis deste artigo.
App.razor
:
@using System.Reflection
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@using Microsoft.Extensions.Logging
@inject ILogger<App> Logger
@inject LazyAssemblyLoader AssemblyLoader
<Router AppAssembly="typeof(App).Assembly"
AdditionalAssemblies="lazyLoadedAssemblies"
OnNavigateAsync="OnNavigateAsync">
<Navigating>
<div style="padding:20px;background-color:blue;color:white">
<p>Loading the requested page…</p>
</div>
</Navigating>
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(MainLayout)" />
</Found>
<NotFound>
<LayoutView Layout="typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
@code {
private List<Assembly> lazyLoadedAssemblies = [];
private bool grantImaharaRobotControlsAssemblyLoaded;
private async Task OnNavigateAsync(NavigationContext args)
{
try
{
if ((args.Path == "robot") && !grantImaharaRobotControlsAssemblyLoaded)
{
var assemblies = await AssemblyLoader.LoadAssembliesAsync(
[ "GrantImaharaRobotControls.{FILE EXTENSION}" ]);
lazyLoadedAssemblies.AddRange(assemblies);
grantImaharaRobotControlsAssemblyLoaded = true;
}
}
catch (Exception ex)
{
Logger.LogError("Error: {Message}", ex.Message);
}
}
}
@using System.Reflection
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@using Microsoft.Extensions.Logging
@inject ILogger<App> Logger
@inject LazyAssemblyLoader AssemblyLoader
<Router AppAssembly="typeof(App).Assembly"
AdditionalAssemblies="lazyLoadedAssemblies"
OnNavigateAsync="OnNavigateAsync">
<Navigating>
<div style="padding:20px;background-color:blue;color:white">
<p>Loading the requested page…</p>
</div>
</Navigating>
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(MainLayout)" />
</Found>
<NotFound>
<LayoutView Layout="typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
@code {
private List<Assembly> lazyLoadedAssemblies = new();
private bool grantImaharaRobotControlsAssemblyLoaded;
private async Task OnNavigateAsync(NavigationContext args)
{
try
{
if ((args.Path == "robot") && !grantImaharaRobotControlsAssemblyLoaded)
{
var assemblies = await AssemblyLoader.LoadAssembliesAsync(
new[] { "GrantImaharaRobotControls.{FILE EXTENSION}" });
lazyLoadedAssemblies.AddRange(assemblies);
grantImaharaRobotControlsAssemblyLoaded = true;
}
}
catch (Exception ex)
{
Logger.LogError("Error: {Message}", ex.Message);
}
}
}
@using System.Reflection
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@using Microsoft.Extensions.Logging
@inject ILogger<App> Logger
@inject LazyAssemblyLoader AssemblyLoader
<Router AppAssembly="typeof(Program).Assembly"
AdditionalAssemblies="lazyLoadedAssemblies"
OnNavigateAsync="OnNavigateAsync">
<Navigating>
<div style="padding:20px;background-color:blue;color:white">
<p>Loading the requested page…</p>
</div>
</Navigating>
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(MainLayout)" />
</Found>
<NotFound>
<LayoutView Layout="typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
@code {
private List<Assembly> lazyLoadedAssemblies = new List<Assembly>();
private bool grantImaharaRobotControlsAssemblyLoaded;
private async Task OnNavigateAsync(NavigationContext args)
{
try
{
if ((args.Path == "robot") && !grantImaharaRobotControlsAssemblyLoaded)
{
var assemblies = await AssemblyLoader.LoadAssembliesAsync(
new[] { "GrantImaharaRobotControls.{FILE EXTENSION}" });
lazyLoadedAssemblies.AddRange(assemblies);
grantImaharaRobotControlsAssemblyLoaded = true;
}
}
catch (Exception ex)
{
Logger.LogError("Error: {Message}", ex.Message);
}
}
}
Crie e execute o aplicativo.
Quando o componente Robot
da RCL é solicitado em /robot
, o conjunto GrantImaharaRobotControls.{FILE EXTENSION}
é carregado e o componente Robot
é renderizado. Pode inspecionar o carregamento de assemblies no separador Network das ferramentas para programadores do navegador.
Nota
Existe um problema conhecido ao carregar tipos de um assembly de carregamento lento. Para obter mais informações, consulte Blazor WebAssembly lazy loading assemblies not working when using @ref attribute in the component (dotnet/aspnetcore #29342).
Comentários do ASP.NET Core
O ASP.NET Core é um projeto código aberto. Selecione um link para fornecer comentários:
evento
Campeonato Mundial do Power BI DataViz
14/02, 16 - 31/03, 16
Com 4 chances de participar, você pode ganhar um pacote de conferência e chegar ao LIVE Grand Finale em Las Vegas
Mais informaçõesFormação
Módulo
Use páginas, roteamento e layouts para melhorar a navegação no Blazor - Training
Saiba como otimizar a navegação do seu aplicativo, usar parâmetros da URL e criar layouts reutilizáveis em um aplicativo Web Blazor.
Documentação
ASP.NET Core Blazor práticas recomendadas de desempenho.
Dicas para aumentar o desempenho em aplicativos ASP.NET Core Blazor e evitar problemas comuns de desempenho.
Modos de renderização do ASP.NET Core Blazor
Saiba mais sobre os modos de renderização Blazor e como aplicá-los em Blazor Web Apps.
Estrutura do projeto ASP.NET Core Blazor
Saiba mais sobre a estrutura de projeto da aplicação ASP.NET Core Blazor.
ASP.NET Renderização de componentes do Core Razor
Saiba mais sobre Razor renderização de componentes em aplicativos ASP.NET Core Blazor, incluindo quando acionar manualmente um componente para renderizar.