Skip to content

Commit 38d0201

Browse files
added server side rendering
1 parent d18dfc7 commit 38d0201

File tree

5 files changed

+104
-60
lines changed

5 files changed

+104
-60
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
@inject IWeatherClient WeatherClient
2+
<h1>Weather</h1>
3+
4+
<p>This component demonstrates showing data.</p>
5+
6+
@if (forecasts == null)
7+
{
8+
<p><em>Loading...</em></p>
9+
}
10+
else
11+
{
12+
<table class="table">
13+
<thead>
14+
<tr>
15+
<th>Date</th>
16+
<th aria-label="Temperature in Celsius">Temp. (C)</th>
17+
<th aria-label="Temperature in Farenheit">Temp. (F)</th>
18+
<th>Summary</th>
19+
</tr>
20+
</thead>
21+
<tbody>
22+
@foreach (var forecast in forecasts)
23+
{
24+
<tr>
25+
<td>@forecast.Date.ToShortDateString()</td>
26+
<td>@forecast.TemperatureC</td>
27+
<td>@forecast.TemperatureF</td>
28+
<td>@forecast.Summary</td>
29+
</tr>
30+
}
31+
</tbody>
32+
</table>
33+
}
34+
35+
@code {
36+
private WeatherForecast[]? forecasts;
37+
38+
protected override async Task OnInitializedAsync()
39+
{
40+
forecasts = await WeatherClient.GetWeatherForecasts();
41+
}
42+
}
Lines changed: 6 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,10 @@
11
@page "/weather"
2+
@using BlazorBffApp.Client.Components
3+
@using Microsoft.AspNetCore.Authorization
24

3-
<PageTitle>Weather</PageTitle>
4-
5-
<h1>Weather</h1>
6-
7-
<p>This component demonstrates showing data.</p>
8-
9-
@if (forecasts == null)
10-
{
11-
<p><em>Loading...</em></p>
12-
}
13-
else
14-
{
15-
<table class="table">
16-
<thead>
17-
<tr>
18-
<th>Date</th>
19-
<th aria-label="Temperature in Celsius">Temp. (C)</th>
20-
<th aria-label="Temperature in Farenheit">Temp. (F)</th>
21-
<th>Summary</th>
22-
</tr>
23-
</thead>
24-
<tbody>
25-
@foreach (var forecast in forecasts)
26-
{
27-
<tr>
28-
<td>@forecast.Date.ToShortDateString()</td>
29-
<td>@forecast.TemperatureC</td>
30-
<td>@forecast.TemperatureF</td>
31-
<td>@forecast.Summary</td>
32-
</tr>
33-
}
34-
</tbody>
35-
</table>
36-
}
5+
@rendermode InteractiveWebAssembly
6+
@attribute [Authorize]
377

38-
@code {
39-
private WeatherForecast[]? forecasts;
40-
41-
protected override async Task OnInitializedAsync()
42-
{
43-
// Simulate asynchronous loading to demonstrate a loading indicator
44-
await Task.Delay(500);
45-
46-
var startDate = DateOnly.FromDateTime(DateTime.Now);
47-
var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
48-
forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
49-
{
50-
Date = startDate.AddDays(index),
51-
TemperatureC = Random.Shared.Next(-20, 55),
52-
Summary = summaries[Random.Shared.Next(summaries.Length)]
53-
}).ToArray();
54-
}
8+
<PageTitle>Weather</PageTitle>
559

56-
private class WeatherForecast
57-
{
58-
public DateOnly Date { get; set; }
59-
public int TemperatureC { get; set; }
60-
public string? Summary { get; set; }
61-
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
62-
}
63-
}
10+
<WeatherComponent @rendermode="new InteractiveWebAssemblyRenderMode(prerender:false)" />

BFF/v3/Quickstarts/BlazorBffApp/BlazorBffApp.Client/Program.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,15 @@
44
var builder = WebAssemblyHostBuilder.CreateDefault(args);
55

66
builder.Services
7-
.AddBffBlazorClient(); // Provides auth state provider that polls the /bff/user endpoint
7+
.AddBffBlazorClient()// Provides auth state provider that polls the /bff/user endpoint
8+
9+
// Register a HTTP Client that's configured to fetch data from the server.
10+
.AddLocalApiHttpClient<WeatherHttpClient>();
11+
12+
// Register the concrete implementation with the abstraction
13+
builder.Services.AddSingleton<IWeatherClient, WeatherHttpClient>();
814

915
builder.Services
1016
.AddCascadingAuthenticationState();
17+
1118
await builder.Build().RunAsync();
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System.Net.Http.Json;
2+
using System.Text.Json;
3+
4+
public class WeatherHttpClient(HttpClient client) : IWeatherClient
5+
{
6+
public async Task<WeatherForecast[]> GetWeatherForecasts() => await client.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast")
7+
?? throw new JsonException("Failed to deserialize");
8+
}
9+
10+
public class WeatherForecast
11+
{
12+
public DateOnly Date { get; set; }
13+
public int TemperatureC { get; set; }
14+
public string? Summary { get; set; }
15+
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
16+
}
17+
18+
public interface IWeatherClient
19+
{
20+
Task<WeatherForecast[]> GetWeatherForecasts();
21+
}

BFF/v3/Quickstarts/BlazorBffApp/BlazorBffApp/Program.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
.AddServerSideSessions() // Add in-memory implementation of server side sessions
1515
.AddBlazorServer();
1616

17+
//builder.Services.AddHttpClient<WeatherHttpClient>(opt => opt.BaseAddress = new Uri("https://localhost:7007"));
1718

1819
// Configure the authentication
1920
builder.Services.AddAuthentication(options =>
@@ -60,6 +61,9 @@
6061

6162
builder.Services.AddAuthorization();
6263

64+
// Register a server abstraction.
65+
builder.Services.AddSingleton<IWeatherClient, ServerWeatherClient>();
66+
6367
var app = builder.Build();
6468

6569
// Configure the HTTP request pipeline.
@@ -88,10 +92,33 @@
8892
// Add the BFF management endpoints, such as login, logout, etc.
8993
app.MapBffManagementEndpoints();
9094

95+
app.MapGet("/WeatherForecast", (IWeatherClient weatherClient) => weatherClient.GetWeatherForecasts());
96+
9197
app.MapStaticAssets();
9298
app.MapRazorComponents<App>()
9399
.AddInteractiveServerRenderMode()
94100
.AddInteractiveWebAssemblyRenderMode()
95101
.AddAdditionalAssemblies(typeof(BlazorBffApp.Client._Imports).Assembly);
96102

97103
app.Run();
104+
105+
106+
public class ServerWeatherClient : IWeatherClient
107+
{
108+
public Task<WeatherForecast[]> GetWeatherForecasts()
109+
{
110+
var startDate = DateOnly.FromDateTime(DateTime.Now);
111+
112+
string[] summaries = [
113+
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
114+
];
115+
116+
117+
return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast
118+
{
119+
Date = startDate.AddDays(index),
120+
TemperatureC = Random.Shared.Next(-20, 55),
121+
Summary = summaries[Random.Shared.Next(summaries.Length)]
122+
}).ToArray());
123+
}
124+
}

0 commit comments

Comments
 (0)