diff --git a/Data/WeatherForecast.cs b/Data/WeatherForecast.cs deleted file mode 100644 index 4056353..0000000 --- a/Data/WeatherForecast.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace blazor_lifetime.Data -{ - public class WeatherForecast - { - public DateTime Date { get; set; } - - public int TemperatureC { get; set; } - - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); - - public string Summary { get; set; } - } -} diff --git a/Data/WeatherForecastService.cs b/Data/WeatherForecastService.cs deleted file mode 100644 index 2d6cf8c..0000000 --- a/Data/WeatherForecastService.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; - -namespace blazor_lifetime.Data -{ - public class WeatherForecastService - { - private static readonly string[] Summaries = new[] - { - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" - }; - - public Task GetForecastAsync(DateTime startDate) - { - var rng = new Random(); - return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast - { - Date = startDate.AddDays(index), - TemperatureC = rng.Next(-20, 55), - Summary = Summaries[rng.Next(Summaries.Length)] - }).ToArray()); - } - } -} diff --git a/Models/IAsyncComponentBase.cs b/Models/IAsyncComponentBase.cs new file mode 100644 index 0000000..3a87f7f --- /dev/null +++ b/Models/IAsyncComponentBase.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; + +namespace blazor_lifetime.Models +{ + public delegate Task RenderHandleAsync(); + public interface IAsyncComponentBase + { + RenderHandleAsync RenderChildContentAsync { get; set; } + } +} \ No newline at end of file diff --git a/Pages/AsyncContentRendering.razor b/Pages/AsyncContentRendering.razor new file mode 100644 index 0000000..a0cb189 --- /dev/null +++ b/Pages/AsyncContentRendering.razor @@ -0,0 +1,5 @@ +@page "/async" + +

Async Content Rendering

+ + \ No newline at end of file diff --git a/Pages/Counter.razor b/Pages/Counter.razor deleted file mode 100644 index 6462070..0000000 --- a/Pages/Counter.razor +++ /dev/null @@ -1,19 +0,0 @@ -@page "/counter" - -

Counter

- -

Current count: @currentCount

- - -
- - - -@code { - private int currentCount = 0; - - private void IncrementCount() - { - currentCount++; - } -} diff --git a/Pages/FetchData.razor b/Pages/FetchData.razor deleted file mode 100644 index 2a28df2..0000000 --- a/Pages/FetchData.razor +++ /dev/null @@ -1,46 +0,0 @@ -@page "/fetchdata" - -@using blazor_lifetime.Data -@inject WeatherForecastService ForecastService - -

Weather forecast

- -

This component demonstrates fetching data from a service.

- -@if (forecasts == null) -{ -

Loading...

-} -else -{ - - - - - - - - - - - @foreach (var forecast in forecasts) - { - - - - - - - } - -
DateTemp. (C)Temp. (F)Summary
@forecast.Date.ToShortDateString()@forecast.TemperatureC@forecast.TemperatureF@forecast.Summary
-} - -@code { - private WeatherForecast[] forecasts; - - protected override async Task OnInitializedAsync() - { - forecasts = await ForecastService.GetForecastAsync(DateTime.Now); - } -} diff --git a/Pages/ImprovedAsyncContentRendering.razor b/Pages/ImprovedAsyncContentRendering.razor new file mode 100644 index 0000000..c9cf6ab --- /dev/null +++ b/Pages/ImprovedAsyncContentRendering.razor @@ -0,0 +1,5 @@ +@page "/async_improved" + +

Improved Async Content Rendering

+ + \ No newline at end of file diff --git a/Pages/Index.razor b/Pages/Index.razor index c122431..8b22e47 100644 --- a/Pages/Index.razor +++ b/Pages/Index.razor @@ -1,5 +1,5 @@ @page "/" -

Hello, world!

+

HELLO!

-Welcome to your new app. +Welcome to async content test app. diff --git a/Pages/SyncContentRendering.razor b/Pages/SyncContentRendering.razor new file mode 100644 index 0000000..b9c6875 --- /dev/null +++ b/Pages/SyncContentRendering.razor @@ -0,0 +1,5 @@ +@page "/sync" + +

Sync Content Rendering

+ + diff --git a/Shared/AdvancedComponentBase.cs b/Shared/AdvancedComponentBase.cs new file mode 100644 index 0000000..3f74c76 --- /dev/null +++ b/Shared/AdvancedComponentBase.cs @@ -0,0 +1,31 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using blazor_lifetime.Models; + +namespace blazor_lifetime.Shared +{ + public class AdvancedComponentBase : OwningComponentBase, IAsyncComponentBase + { + [Parameter] public virtual RenderFragment ChildContent { get; set; } + public RenderHandleAsync RenderChildContentAsync { get; set; } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + await OnComponentMountAsync().ConfigureAwait(false); + if (RenderChildContentAsync != null) + { + await RenderChildContentAsync(); + } + } + else + { + await Task.CompletedTask; + } + } + + protected virtual Task OnComponentMountAsync() + => Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Shared/AsyncContentSupport.razor b/Shared/AsyncContentSupport.razor new file mode 100644 index 0000000..6730b3e --- /dev/null +++ b/Shared/AsyncContentSupport.razor @@ -0,0 +1,36 @@ +@using blazor_lifetime.Models + +@if (_isContentVisible) +{ + @ChildContent +} +else +{ + @if (LoadingContent != null) + { + @LoadingContent + } +} + +@code{ + private bool _isContentVisible = false; + + [Parameter] public RenderFragment ChildContent { get; set; } + [Parameter] public RenderFragment LoadingContent { get; set; } + [Parameter] public IAsyncComponentBase Component { get; set; } + + protected override void OnInitialized() + { + if (Component == null) + { + throw new Exception(nameof(Component)); + } + Component.RenderChildContentAsync += OnRenderChildContentAsync; + } + + protected async Task OnRenderChildContentAsync() + { + _isContentVisible = true; + await InvokeAsync(StateHasChanged); + } +} \ No newline at end of file diff --git a/Shared/FirstLevelAdvancedComponentAsync.razor b/Shared/FirstLevelAdvancedComponentAsync.razor new file mode 100644 index 0000000..2fa4cd3 --- /dev/null +++ b/Shared/FirstLevelAdvancedComponentAsync.razor @@ -0,0 +1,12 @@ +@inherits FirstLevelAdvancedComponentAsyncModel + + + + Please wait... Content is loading... + + +
First Component Start
+ +
First Component End
+
+
\ No newline at end of file diff --git a/Shared/FirstLevelAdvancedComponentAsync.razor.cs b/Shared/FirstLevelAdvancedComponentAsync.razor.cs new file mode 100644 index 0000000..4b66c58 --- /dev/null +++ b/Shared/FirstLevelAdvancedComponentAsync.razor.cs @@ -0,0 +1,19 @@ +using blazor_lifetime.Models; +using Microsoft.AspNetCore.Components; +using System; +using System.Threading.Tasks; + +namespace blazor_lifetime.Shared +{ + public class FirstLevelAdvancedComponentAsyncModel : AdvancedComponentBase + { + protected string AsyncParameter { get; set; } + protected override async Task OnComponentMountAsync() + { + Console.WriteLine($"{GetType().Name}.OnComponentMountAsync.Start"); + await Task.Delay(500); + AsyncParameter = "value 123"; + Console.WriteLine($"{GetType().Name}.OnComponentMountAsync.End"); + } + } +} \ No newline at end of file diff --git a/Pages/FirstLevelComponent.razor b/Shared/FirstLevelComponent.razor similarity index 100% rename from Pages/FirstLevelComponent.razor rename to Shared/FirstLevelComponent.razor diff --git a/Pages/FirstLevelComponent.razor.cs b/Shared/FirstLevelComponent.razor.cs similarity index 92% rename from Pages/FirstLevelComponent.razor.cs rename to Shared/FirstLevelComponent.razor.cs index 926472c..774b2ba 100644 --- a/Pages/FirstLevelComponent.razor.cs +++ b/Shared/FirstLevelComponent.razor.cs @@ -2,7 +2,7 @@ using System; using System.Threading; -namespace blazor_lifetime.Pages +namespace blazor_lifetime.Shared { public class FirstLevelComponentModel : ComponentBase { @@ -30,7 +30,8 @@ namespace blazor_lifetime.Pages Console.WriteLine($"{GetType().Name}.OnAfterRender(FirstRender).Start"); Thread.Sleep(500); Console.WriteLine($"{GetType().Name}.OnAfterRender(FirstRender).End"); - } else + } + else { Console.WriteLine($"{GetType().Name}.OnAfterRender.Start"); Thread.Sleep(500); diff --git a/Pages/FirstLevelComponentAsync.razor b/Shared/FirstLevelComponentAsync.razor similarity index 100% rename from Pages/FirstLevelComponentAsync.razor rename to Shared/FirstLevelComponentAsync.razor diff --git a/Pages/FirstLevelComponentAsync.razor.cs b/Shared/FirstLevelComponentAsync.razor.cs similarity index 90% rename from Pages/FirstLevelComponentAsync.razor.cs rename to Shared/FirstLevelComponentAsync.razor.cs index adb00f9..4ceee91 100644 --- a/Pages/FirstLevelComponentAsync.razor.cs +++ b/Shared/FirstLevelComponentAsync.razor.cs @@ -2,7 +2,7 @@ using System; using System.Threading.Tasks; -namespace blazor_lifetime.Pages +namespace blazor_lifetime.Shared { public class FirstLevelComponentAsyncModel : ComponentBase { @@ -10,7 +10,7 @@ namespace blazor_lifetime.Pages protected override async Task OnInitializedAsync() { Console.WriteLine($"{GetType().Name}.OnInitialized.Start"); - await Task.Delay(500); + await Task.Delay(500); AsyncParameter = "value 123"; Console.WriteLine($"{GetType().Name}.OnInitialized.End"); } @@ -29,7 +29,8 @@ namespace blazor_lifetime.Pages Console.WriteLine($"{GetType().Name}.OnAfterRender(FirstRender).Start"); await Task.Delay(500); Console.WriteLine($"{GetType().Name}.OnAfterRender(FirstRender).End"); - } else + } + else { Console.WriteLine($"{GetType().Name}.OnAfterRender.Start"); await Task.Delay(500); diff --git a/Shared/NavMenu.razor b/Shared/NavMenu.razor index 4fff27f..73a7a1c 100644 --- a/Shared/NavMenu.razor +++ b/Shared/NavMenu.razor @@ -13,13 +13,18 @@ + diff --git a/Pages/SecondLevelComponent.razor b/Shared/SecondLevelComponent.razor similarity index 100% rename from Pages/SecondLevelComponent.razor rename to Shared/SecondLevelComponent.razor diff --git a/Pages/SecondLevelComponent.razor.cs b/Shared/SecondLevelComponent.razor.cs similarity index 90% rename from Pages/SecondLevelComponent.razor.cs rename to Shared/SecondLevelComponent.razor.cs index 6fdcda2..55aa05d 100644 --- a/Pages/SecondLevelComponent.razor.cs +++ b/Shared/SecondLevelComponent.razor.cs @@ -2,12 +2,13 @@ using System; using System.Threading; -namespace blazor_lifetime.Pages +namespace blazor_lifetime.Shared { public class SecondLevelComponentModel : ComponentBase { private string _parameter; - [Parameter] public string Parameter + [Parameter] + public string Parameter { get { @@ -41,7 +42,8 @@ namespace blazor_lifetime.Pages Console.WriteLine($"{GetType().Name}.OnAfterRender(FirstRender).Start"); Thread.Sleep(500); Console.WriteLine($"{GetType().Name}.OnAfterRender(FirstRender).End"); - } else + } + else { Console.WriteLine($"{GetType().Name}.OnAfterRender.Start"); Thread.Sleep(500); diff --git a/Pages/SecondLevelComponentAsync.razor b/Shared/SecondLevelComponentAsync.razor similarity index 100% rename from Pages/SecondLevelComponentAsync.razor rename to Shared/SecondLevelComponentAsync.razor diff --git a/Pages/SecondLevelComponentAsync.razor.cs b/Shared/SecondLevelComponentAsync.razor.cs similarity index 92% rename from Pages/SecondLevelComponentAsync.razor.cs rename to Shared/SecondLevelComponentAsync.razor.cs index 09dfc14..3c0485b 100644 --- a/Pages/SecondLevelComponentAsync.razor.cs +++ b/Shared/SecondLevelComponentAsync.razor.cs @@ -2,12 +2,13 @@ using System; using System.Threading.Tasks; -namespace blazor_lifetime.Pages +namespace blazor_lifetime.Shared { public class SecondLevelComponentAsyncModel : ComponentBase { private string _parameter; - [Parameter] public string Parameter + [Parameter] + public string Parameter { get { diff --git a/Startup.cs b/Startup.cs index 60eda52..4cae295 100644 --- a/Startup.cs +++ b/Startup.cs @@ -1,15 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using blazor_lifetime.Data; namespace blazor_lifetime { @@ -22,16 +15,12 @@ namespace blazor_lifetime public IConfiguration Configuration { get; } - // This method gets called by the runtime. Use this method to add services to the container. - // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddServerSideBlazor(); - services.AddSingleton(); } - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) @@ -41,7 +30,6 @@ namespace blazor_lifetime else { app.UseExceptionHandler("/Error"); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); }