Note: This answer is from December 2018 when an early version of Server-side Blazor was available. Most likely, it is no longer relevant.
The poor man’s approach to state is a hinted by @JohnB: Use a scoped service. In server-side Blazor, scoped service as tied to the SignalR connection. This is the closest thing to a session you can get. It’s certainly private to a single user. But it’s also easily lost. Reloading the page or modifying the URL in the browser’s address list loads start a new SignalR connection, creates a new service instance and thereby loses the state.
So first create the state service:
public class SessionState
{
public string SomeProperty { get; set; }
public int AnotherProperty { get; set; }
}
Then configure the service in the Startup class of the App project (not server project):
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<SessionState>();
}
public void Configure(IBlazorApplicationBuilder app)
{
app.AddComponent<Main>("app");
}
}
Now you can inject the state into any Blazor page:
@inject SessionState state
<p>@state.SomeProperty</p>
<p>@state.AnotherProperty</p>
Better solutions are still super welcome.