.NET 8.0 Release Candidate 2 überarbeitet nochmals die Blazor-Projektvorlagen

Der zweite Release Candidate für .NET 8.0 bringt weitere Flexibilität in der Projektvorlage "Blazor Web App" und kleinere Neuerungen für Entity Framework Core.

In Pocket speichern vorlesen Druckansicht 3 Kommentare lesen

(Bild: Shutterstock)

Lesezeit: 9 Min.
Von
  • Dr. Holger Schwichtenberg
Inhaltsverzeichnis

In .NET 8.0 Release Candidate 2, der nun rund einen Monat nach Release Candidate 1 erschienen ist, hat Microsoft die gemeinsame Projektvorlage "Blazor Web App" für alle browserbasierten Blazor-Arten erneut überarbeitet. Bereits zuvor konnten Entwicklerinnen und Entwickler beim Anlegen eines Projekts wählen zwischen Blazor Server Side Rendering, Blazor Server, Blazor WebAssembly und dem Auto-Modus, der von Blazor Server zu Blazor WebAssembly automatisch umschaltet.

Während es in der Projektvorlage "Blazor Web App" für die Auswahl zuvor eine Reihe von Checkboxen gab, gibt es im neuen Release Candidate zwei Auswahllisten: In der ersten lässt sich der Interaktivitätstypus wählen. In der zweiten wählt man, ob der Interaktivitätstypus auf einzelne Seiten oder die ganze Anwendung angewendet werden soll (Abbildung 1). Bei der Nutzung des Kommandozeilenbefehls dotnet new heißen die Parameter --interactivity (mit den möglichen Werten None, Server, WebAssembly und Auto) und --all-interactive (ohne weitere Angabe), was "Global" entspricht (Abbildung 2). Im Standard lautet der Kommandozeilenbefehl also "Per page/component".

Diese neuen Optionen bietet die Projektvorlage "Blazor Web App" (Abb. 1).

(Bild: Dr. Holger Schwichtenberg)

So zeigt sich die Projektvorlage "Blazor Web App" auf der Kommandozeile (Abb. 2).

(Bild: Dr. Holger Schwichtenberg)

Bei der Auswahl von "Per page/component" erhält man wie bisher einzelne Razor Components mit Annotationen, wobei Microsoft diese gegenüber Release Candidate 1 umbenannt hat. Die neuen Namen sind jetzt:

@attribute [RenderModeInteractiveServer]
@attribute [RenderModeInteractiveWebAssembly]
@attribute [RenderModeInteractiveAuto]

Im Blogeintrag zu ASP.NET Core 8.0 Release Candidate 2 verkündet Microsoft, dass es ab jetzt auch eine kürzere Syntaxform gibt:

@rendermode InteractiveServer
@rendermode InteractiveWebAssembly
@rendermode InteractiveAuto

Diese wird in den Projektvorlagen aber noch nicht verwendet. Die Umsetzung soll zum endgültigen Erscheinungstermin von .NET 8.0 erfolgen.

Die neue Auswahl "Global" in Abbildung 1 führt dazu, dass der Render-Modus nicht in einzelnen Seiten, sondern der App.razor-Datei für alle Seiten gesetzt wird:

<Routes @rendermode="@RenderMode.InteractiveServer" />
<Routes @rendermode="@RenderMode.InteractiveWebAssembly" />
<Routes @rendermode="@RenderMode.InteractiveAuto" />

Sofern der Interaktivitätstypus auf "None" gesetzt wurde, findet sich allerdings keine dieser Render-Modus-Einstellungen in der Projektvorlage. Es macht bei "None" auch keinen Unterschied, ob man im zweiten Auswahlfeld "Global" oder "Per page/component" gewählt hat: Man erhält wie schon in den vorherigen Vorschauversionen nur die Seiten Home.razor und Weather.razor, letztere mit @attribute [StreamRendering(true)], aber keine Seite Counter.razor, die es in den Vorlagen mit Blazor Server und Blazor WebAssembly gibt.

Mit den neuen Optionen können Entwicklerinnen und Entwickler Projekte erschaffen, die den bisherigen Projektvorlagen "Blazor Server App" und "Blazor WebAssembly App" entsprechen. Diese beiden Projektvorlagen (einschließlich ihrer Schwestervorlagen mit "Empty" im Namen) gibt es für .NET 8.0 nicht mehr. Neben der "Blazor Web App" gibt es noch eine Vorlage "Blazor WebAssembly Standalone App" mit einer Option "Include Sample Pages".

Die Standalone-App ist ein Teil der bisherigen Projektvorlage "Blazor WebAssembly App" und erstellt eine Blazor-WebAssembly-Anwendung, die nicht von ASP.NET Core auf dem Webserver abhängig ist, sondern auf jedem beliebigen (ggf. statischen) Webserver zum Download für den Webbrowser liegen kann.

Weiterhin gibt es eine Projektvorlage ".NET MAUI Blazor Hybrid App", die von den Umbauarbeiten nicht betroffen ist. Eine Projektvorlage für hybride Blazor-Anwendungen mit Windows Forms und Windows Presentation Foundation (WPF) sucht man weiterhin vergeblich im .NET SDK.

Insgesamt gibt es im .NET SDK drei aktuelle Blazor-8.0-Projektvorlagen:

  • "Blazor Web App"
  • "Blazor WebAssembly Standalone App"
  • ".NET MAUI Blazor Hybrid App"

Alle anderen Projektvorlagen, die Visual Studio im Suchdialog anbietet (Abbildung 3), stellen in den Folgeseiten keine Auswahl für .NET 8.0 zur Verfügung. Dennoch könnte man die Vorlagen noch verwenden und manuell das <TargetFramework> auf .NET 8.0 umstellen sowie die Breaking Changes berücksichtigen. Das ist möglich, da Microsoft auch die Umstellung mit vorherigen Versionen erstellter Blazor-Server- und Blazor-WebAssembly-Projekte auf .NET 8.0 erlaubt, ohne auf die neue Projektstruktur der Blazor Web App umsteigen zu müssen.

Übersicht der Blazor-Projektvorlagen in .NET 8.0 Release Candidate 2 (Abb. 3).

(Bild: Dr. Holger Schwichtenberg)

Die neuen Blazor-Funktionen hat Microsoft an weiteren Stellen abgerundet. Blazor versucht auch beim Server-Side Rendering (SSR) nicht immer ganze HTML-Seiten zu senden, sondern mithilfe von JavaScript einzelne geänderte Seitenteile auszutauschen. Diese "Enhanced Navigation" genannte Funktion können Entwicklerinnen und Entwickler nun per HTML-Attribut abschalten. Das ist beim Navigieren zu einer Seite außerhalb von Blazor sinnvoll, da Blazor sonst den Aufruf unnötigerweise abfängt:

<a href="my-non-blazor-page" data-enhance-nav="false">Seiten außerhalb der Blazor-Anwendung</a>

Auch lässt sich mit data-permanent verhindern, dass Enhanced Navigation einzelne Seitenteile ersetzt, die per JavaScript geändert wurden:

<div data-permanent>
    This div gets updated dynamically by a script when the page loads!
</div>

Außerdem kann man sich jeweils informieren lassen, sobald eine partielle Seitenaktualisierung stattgefunden hat. Dazu ist nach dem Laden der JavaScript-Datei blazor.web.js das Ereignis enhancedload() in JavaScript zu behandeln:

<body>
    <Routes />
    <script src="_framework/blazor.web.js"></script>
    <script>
  Blazor.addEventListener('enhancedload', (e) => console.warn('Seitenteile wurden aktualisiert',e));
    </script>
</body>

Die Formulardatenbindung in Blazor SSR beachtet nun auch die Annotationen [DataMember] und [IgnoreDataMember]. Eine Instanz der Klasse HttpContext können Entwicklerinnen und Entwickler in einer Razor Component als kaskadierenden Parameter beziehen:

[CascadingParameter]
public HttpContext? HttpContext { get; set; }

Beim HTML-Tag <dialog> kann Blazor nun die Ereignisse OnOpen() und OnClose() behandeln. Bei der Annotation [Inject] lässt sich nun auch ein Name angeben, beispielsweise

[Inject(Key = "my-service")]
public IMyService MyService { get; set; }

Sogenannte "Keyed Dependency Injection Services" sind neu in .NET 8.0. Allerdings fehlt auch in Release Candidate 2 noch die Fähigkeit, sie bei der @inject-Direktive in der Razor-Syntax zu nutzen.

Neben den Neuerungen in Blazor erwähnt Microsoft im Blogeintrag zu ASP.NET Core Release Candidate 2 nur noch wenige weitere Neuerungen. Dazu gehört, dass nun auch der TypeScript-Client für ASP.NET Core SignalR ein automatisches Wiederherstellen einer Verbindung beherrscht:

const builder = new signalR.HubConnectionBuilder()
    .withUrl("/hubname")
    .withStatefulReconnect({ bufferSize: 1000 }); // optional options, defaults to 100,000
const connection = builder.build();

Diese Möglichkeit gibt es seit .NET 8.0 Preview 5 – bisher aber nur für .NET-Clients.