Die fünfte Vorschauversion der kommenden .NET-Version 11.0 ist gestern Abend erschienen. Parallel dazu gab es auch die Version 11904.113 der für .NET 11.0 notwendigen Insiders-Variante von Visual Studio 2026. Alternativ ist eine Arbeit mit Visual Studio Code und dem im SDK mitgelieferten Kommandozeilencompiler möglich.
Dr. Holger Schwichtenberg hat Fachbücher zu .NET 10.0, C# 14.0, Blazor 10.0 und Entity Framework Core 10.0 veröffentlicht. Er arbeitet als Berater und Trainer bei www.IT-Visions.de.
(Bild: King / stock.adobe.com)
Das ist neu in .NET 11.0: Dr. Holger Schwichtenberg und weitere Experten präsentieren am 17. November 2026 auf der Online-Konferenz betterCode() .NET 11.0 die Änderungen für Entwicklerinnen und Entwickler in .NET SDK, C# 15.0 und mehr. Bis zur Veröffentlichung des Programms sind vergünstigte Blind-Bird-Tickets verfügbar.
Sortieren und Paging beim <QuickGrid> bei Blazor Static SSR
Bei dem in .NET 8.0 eingeführten statischen serverseitigen Rendering (Blazor Static SSR), das als eine Ablösung für ASP.NET Core MVC und ASP.NET Core Razor Pages verstanden werden kann, funktioniert das Tabellensteuerelement QuickGrid, das Microsoft im NuGet-Paket Microsoft.AspNetCore.Components.QuickGrid liefert, bisher nur eingeschränkt. Lediglich bei den interaktiven Varianten Blazor Server und Blazor WebAssembly sowie Blazor Hybrid stehen alle Funktionen des QuickGrid-Steuerelements zur Verfügung.
Seit Blazor 11.0 Preview 5 ist es möglich, dass das QuickGrid-Steuerelement auch in statisch serverseitig gerenderten Blazor-Seiten sortieren und blättern kann. Wenn das Grid nicht interaktiv ist, werden die sortierbaren Spaltenüberschriften und die Seitennavigation als erweiterte HTML-Formulare gerendert, die ihren Zustand über URL-Abfrageparameter (Query String) übertragen. Lädt eine Nutzerin oder ein Nutzer die Seite neu oder kopiert die URL und öffnet sie erneut, bleiben Sortierung und aktuelle Seite erhalten. Dadurch lassen sich diese Zustände einfach per URL teilen oder als Lesezeichen speichern.
Im Schnelltest zeigte sich: In Zusammenarbeit mit Entity Framework Core als Datenquelle mit Paging in der Datenbank erzeugt das Blättern einen Laufzeitfehler: „InvalidOperationException: A second operation was started on this context instance before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext.“
Das folgende Beispiel funktioniert aktuell nur korrekt, wenn es immer alle Datensätze lädt und das Paging im RAM ausführt via
private List<BO.WWWings.Flight> flightSet => context.Flights.ToList();
@page "/QuickGridSSR" @using Microsoft.AspNetCore.Components.QuickGrid @using Microsoft.EntityFrameworkCore @inject IDbContextFactory<DA.WWWings.WwwingsV1EnContext> DbFactory @implements IAsyncDisposable <PageTitle>QuickGrid SSR</PageTitle> <h1>Sortieren und Paging beim QuickGrid bei Blazor Static SSR</h1> <QuickGrid Class="table table-striped sticky-grid" Items="@flightSet" Pagination="@pagination"> <PropertyColumn Property="@(p => p.FlightNo)" Title="FlugNr" Sortable="true" /> <PropertyColumn Property="@(p => p.Departure)" Title="Abflugort" Sortable="true"> </PropertyColumn> <PropertyColumn Property="@(p => p.Destination)" Title="Zielort" Sortable="true"> </PropertyColumn> <PropertyColumn Property="@(p => p.FlightDate)" Title="Datum" Format="dd.MM.yyyy" Sortable="true" /> <PropertyColumn Property="@(p => p.FreeSeats)" Title="Freie Plätze" /> </QuickGrid> <Paginator State="@pagination" /> @code { private readonly PaginationState pagination = new() { ItemsPerPage = 15 }; private DA.WWWings.WwwingsV1EnContext context; private IQueryable<BO.WWWings.Flight> flightSet => context.Flights; protected override void OnInitialized() { context = DbFactory.CreateDbContext(); } // IAsyncDisposable implementieren, um den DbContext korrekt zu verwerfen, wenn die Komponente nicht mehr benötigt wird public async ValueTask DisposeAsync() { if (context != null) { await context.DisposeAsync(); } } }Listing: QuickGrid mit Blazor Static SSR mit Zugriff auf eine Datenbank via Entity Framework Core
Das vorherige Listing zur Laufzeit (Seite 1)
Vereinfachte Session-Handhabung
Blazor Static SSR unterstützt seit der Einführung in .NET 8.0 die in ASP.NET Core verfügbaren serverseitigen Sessions (Cookie .AspNetCore.Session mit Session-ID, Speicherung der Daten im RAM oder einem persistenten Speicher) zur Datenübergabe zwischen Seiten. Bisher mussten Entwicklerinnen und Entwickler dafür das Session-Objekt im HttpContext-Objekt verwenden und komplexe Objekte selbst per JSON serialisieren:
@inject IHttpContextAccessor HttpContextAccessor … var HttpContext = HttpContextAccessor.HttpContext; var json = System.Text.Json.JsonSerializer.Serialize(regForm); HttpContext.Session.SetString("Formulardaten", json);beziehungsweise
BO.RegistrationData daten = System.Text.Json.JsonSerializer.Deserialize<BO.RegistrationData>( HttpContext.Session.GetString("Formulardaten") ?? string.Empty);In .NET 11.0 Preview 5 hat Microsoft nun die Annotation [SupplyParameterFromSession] eingeführt, die die Handhabung von Session-Variablen genauso einfach macht wie von Query-String-Parametern [SupplyParameterFromQuery], Form-Daten [SupplyParameterFromForm] und TempData-Werten [SupplyParameterFromTempData], wobei letztere Annotation erst in .NET 11.0 Preview 4 eingeführt wurde.
Entwicklerinnen und Entwickler annotieren in einer Seite eine oder mehrere Properties mit der Annotation [SupplyParameterFromSession]. Dabei sind einfache und komplexe Datentypen möglich, während [SupplyParameterFromTempData] auch in Preview 5 weiterhin nur mit einfachen Datentypen funktioniert:
[SupplyParameterFromSession] public string Message { get; set; } [SupplyParameterFromSession] public BO.RegistrationData RegData { get; set; }Session-Werte werden dabei automatisch mit System.Text.Json in JSON serialisiert.
Analoge Properties deklarieren Entwicklerinnen und Entwickler in den Folgeseiten und können dann auf die Werte ohne weiteres Zutun zugreifen. Voraussetzung ist wie bisher, dass in der Startseite die Sessions aktiviert wurden:
builder.Services.AddDistributedMemoryCache(); builder.Services.AddSession(); … app.UseSession();










English (US) ·