{"id":249596,"date":"2026-08-13T15:59:10","date_gmt":"2026-08-13T15:59:10","guid":{"rendered":"https:\/\/www.europesays.com\/ch-de\/249596\/"},"modified":"2026-08-13T15:59:10","modified_gmt":"2026-08-13T15:59:10","slug":"net-11-0-preview-7-bringt-viele-neuigkeiten-und-breaking-changes","status":"publish","type":"post","link":"https:\/\/www.europesays.com\/ch-de\/249596\/","title":{"rendered":".NET 11.0 Preview 7 bringt viele Neuigkeiten und Breaking Changes"},"content":{"rendered":"<p>.NET 11.0 Preview 7 gibt es kostenfrei <a href=\"https:\/\/dotnet.microsoft.com\/en-us\/download\/dotnet\/11.0\" rel=\"external noopener nofollow\" target=\"_blank\">zum Download bei Microsoft<\/a>. Dabei handelt es sich um die letzte Preview-Version vor dem ersten Release Candidate. Parallel dazu ist ein Update f\u00fcr Visual Studio 2026 Insiders auf die Version 12106.202 erschienen.<\/p>\n<p>        Weiterlesen nach der Anzeige<\/p>\n<p>    <img loading=\"lazy\" decoding=\"async\" alt=\"Dr. Holger Schwichtenberg\" height=\"1033\" src=\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='696px' height='391px' viewBox='0 0 696 391'%3E%3Crect x='0' y='0' width='696' height='391' fill='%23f2f2f2'%3E%3C\/rect%3E%3C\/svg%3E\" style=\"aspect-ratio: 775 \/ 1033; object-fit: cover;\" width=\"775\"\/><\/p>\n<p class=\"a-inline-textbox__synopsis\">\n          Dr. Holger Schwichtenberg hat Fachb\u00fccher zu .NET 10.0, C# 14.0, Blazor 10.0 und Entity Framework Core 10.0 ver\u00f6ffentlicht. Er arbeitet als Berater und Trainer bei www.IT-Visions.de. &#13;<\/p>\n<p>      <a href=\"https:\/\/www.heise.de\/imgs\/18\/5\/1\/4\/6\/1\/3\/9\/image1-b6af7a82a4228827.png\" rel=\"nofollow noopener\" target=\"_blank\"><\/p>\n<p>  <img loading=\"lazy\" decoding=\"async\" alt=\"Installation des .NET 11.0 SDK in der Version Preview 7 (Abb. 1)\" height=\"737\" src=\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='696px' height='391px' viewBox='0 0 696 391'%3E%3Crect x='0' y='0' width='696' height='391' fill='%23f2f2f2'%3E%3C\/rect%3E%3C\/svg%3E\" style=\"aspect-ratio: 970 \/ 737; object-fit: cover;\" width=\"970\"\/><\/p>\n<p>      <\/a><\/p>\n<p>Installation des .NET 11.0 SDK in der Version Preview 7 (Abb. 1)<\/p>\n<p>Mehr Schleifenkontrolle: break und continue mit Bezeichnern<\/p>\n<p>Die Sprachkonstrukte break zum Abbrechen und continue zum vorzeitigen Fortsetzen von Schleifen gibt es in den meisten Programmiersprachen, so auch in C# seit der ersten Version. Nun erg\u00e4nzt Microsoft aber eine bislang in C# fehlende Option: Entwicklerinnen und Entwickler k\u00f6nnen hinter break und continue jeweils Namen angeben, die sich auf \u00e4u\u00dfere Schleifen beziehen. Damit kann der Compiler nicht nur die jeweils direkt umgebende Schleife, sondern auch \u00fcbergeordnete Schleifen abbrechen oder vorzeitig fortsetzen. Ein solches Label kann man bei den Schleifenkonstrukten for, foreach, while und do sowie bei der Verzweigung mit switch einsetzen.<\/p>\n<p>    <img loading=\"lazy\" decoding=\"async\" alt=\"betterCode() .NET 11.0\" height=\"1080\" src=\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='696px' height='391px' viewBox='0 0 696 391'%3E%3Crect x='0' y='0' width='696' height='391' fill='%23f2f2f2'%3E%3C\/rect%3E%3C\/svg%3E\" style=\"aspect-ratio: 1920 \/ 1080; object-fit: cover;\" width=\"1920\"\/><\/p>\n<p class=\"a-caption__source\">\n      (Bild:\u00a0King \/ stock.adobe.com)\n    <\/p>\n<p>Das ist neu in .NET 11.0: Dr. Holger Schwichtenberg und weitere Experten pr\u00e4sentieren am 17. November 2026 auf der Online-Konferenz <a href=\"https:\/\/net.bettercode.eu\/?wt_mc=intern.conf.dpunkt.konf_dpunkt_bcc_net.empfehlung-ho.link.link&amp;LPID=38418\" rel=\"external noopener nofollow\" target=\"_blank\">betterCode() .NET 11.0<\/a> die \u00c4nderungen f\u00fcr Entwicklerinnen und Entwickler. <a href=\"https:\/\/net.bettercode.eu\/tickets.php?wt_mc=intern.conf.dpunkt.konf_dpunkt_bcc_net.empfehlung-ho.link.link&amp;LPID=38418\" rel=\"external noopener nofollow\" target=\"_blank\">Tickets zum Fr\u00fchbucherpreis<\/a> sind im Online-Shop verf\u00fcgbar.<\/p>\n<p>Das folgende Listing zeigt dazu ein Beispiel, in dem vermieden wird, dass die drei Schleifenebenen jeweils einzeln abgebrochen werden m\u00fcssen, wenn ein passender Regalplatz gefunden wurde.<\/p>\n<p>public void Run()<br \/>\n {<br \/>\n  List Gaenge = [&#171;A&#187;, &#171;B&#187;, &#171;C&#187;, &#171;D&#187;, &#171;E&#187;];<\/p>\n<p>  \/\/ bool sackgasse = false; \/\/ &#8211;&gt; nicht notwendig dank continue mit Label<br \/>\n  \/\/ bool gefunden = false; &#8211;&gt; nicht notwendig dank break mit Label<\/p>\n<p> regalgangSchleife:<br \/>\n  foreach (var regalgang in Gaenge)<br \/>\n  {<br \/>\n   for (int regal = 1; regal &lt;= 20; regal++)<br \/>\n   {<br \/>\n    for (int platz = 1; platz &lt;= 50; platz++)<br \/>\n    {<br \/>\n     \/\/ Sackgasse: In einigen Regalen gibt es Sackgassen<br \/>\n     if (regal % 2 == 1 &amp;&amp; platz % 13 == 0)<br \/>\n     {<br \/>\n      CUI.Warning($&#187;Sackgasse: Gang={regalgang}\/Regal={regal}\/Platz={platz}&#187;);<br \/>\n      \/\/ sackgasse = true; &#8211;&gt; nicht notwendig dank continue mit Label<br \/>\n      continue regalgangSchleife;<\/p>\n<p>     }<br \/>\n     CUI.Print($&#187;Pr\u00fcfe Gang={regalgang}\/Regal={regal}\/Platz={platz}&#187;);<\/p>\n<p>     bool istFrei = IstFrei(regalgang, regal, platz);<br \/>\n     bool istGrossGenug = IstGrossGenug(regalgang, regal, platz);<\/p>\n<p>     if (istFrei &amp;&amp; istGrossGenug)<br \/>\n     {<br \/>\n      CUI.Success($&#187;Gefunden: Gang={regalgang}\/Regal={regal}\/Platz={platz}&#187;);<\/p>\n<p>      \/\/ gefunden = true; &#8211;&gt; nicht notwendig dank break mit Label<br \/>\n      break regalgangSchleife;<br \/>\n     }<br \/>\n    }<br \/>\n    \/\/ if (sackgasse) continue; &#8211;&gt; nicht notwendig dank continue mit Label<br \/>\n    \/\/ if (gefunden) break; &#8211;&gt; nicht notwendig dank break mit Label<br \/>\n   }<br \/>\n   \/\/ if (sackgasse) continue; &#8211;&gt; nicht notwendig dank continue mit Label<br \/>\n   \/\/ if (gefunden) break; &#8211;&gt; nicht notwendig dank break mit Label<br \/>\n  }<br \/>\n }<\/p>\n<p>Listing 1: Einsatz von Labels bei break und continue<\/p>\n<p>        Weiterlesen nach der Anzeige<\/p>\n<p>      <a href=\"https:\/\/www.heise.de\/imgs\/18\/5\/1\/4\/6\/1\/3\/9\/image2-fb963d7ae79c9a61.png\" rel=\"nofollow noopener\" target=\"_blank\"><\/p>\n<p>  <img loading=\"lazy\" decoding=\"async\" alt=\"Der Compiler pr\u00fcft, ob sich der hinter break oder continue angegebene Bezeichner auf eine Schleife oder ein switch bezieht (Abb. 2).\" height=\"178\" src=\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='696px' height='391px' viewBox='0 0 696 391'%3E%3Crect x='0' y='0' width='696' height='391' fill='%23f2f2f2'%3E%3C\/rect%3E%3C\/svg%3E\" style=\"aspect-ratio: 1056 \/ 178; object-fit: cover;\" width=\"1056\"\/><\/p>\n<p>      <\/a><\/p>\n<p>Der Compiler pr\u00fcft, ob sich der hinter break oder continue angegebene Bezeichner auf eine Schleife oder ein switch bezieht (Abb. 2).<\/p>\n<p>Automatisches Pausieren f\u00fcr Blazor-Server-Anwendungen<\/p>\n<p>Blazor Server ist eine Variante von Blazor, bei der C#-Programmcode auf dem Webserver l\u00e4uft und den Webbrowser \u00fcber eine Circuit genannte Websocket-Verbindung aktualisiert, sodass f\u00fcr Benutzer das Erlebnis einer Single-Page-Webanwendung entsteht. Eine Herausforderung ist bei Blazor Server stets der Ressourcenverbrauch auf dem Webserver, denn alle angeschlossenen Webbrowser teilen sich Prozessorleistung und RAM des Webservers.<\/p>\n<p>Seit .NET 10.0 kann man jeden einzelnen Circuit per JavaScript-Code pausieren via Blazor.pauseCircuit() sowie den Zustand im RAM oder einer Datenbank persistieren und sp\u00e4ter wiedererwecken via Blazor.resumeCircuit(), um Ressourcen auf dem Webserver zu sparen, wenn ein Benutzer die Browserregisterkarte mit der Blazor-Anwendung verl\u00e4sst. <a href=\"https:\/\/www.heise.de\/news\/NET-11-0-Preview-4-Ein-bunter-Strauss-von-API-Erweiterungen-11294727.html\" rel=\"nofollow noopener\" target=\"_blank\">Seit .NET 11.0 Preview 4 ist<\/a> das Pausieren von Circuits auch per C#-Code via RequestCircuitPauseAsync() m\u00f6glich.<\/p>\n<p>Die Einf\u00fchrung von RequestCircuitPauseAsync() war die Vorbereitung f\u00fcr das automatische Pausieren, das es nun in Preview 7 gibt. Entwicklerinnen und Entwickler k\u00f6nnen nun im Startcode einer Blazor-Server-Anwendung einstellen, dass die Anwendung pausiert, solange die Browserregisterkarte verdeckt ist. Daf\u00fcr ist ein eigenes NuGet-Paket mit Namen Microsoft.AspNetCore.Components.Server.AutoPause zu erg\u00e4nzen:<\/p>\n<p>      <a href=\"https:\/\/www.heise.de\/imgs\/18\/5\/1\/4\/6\/1\/3\/9\/image3-8bb3e96abe642a10.png\" rel=\"nofollow noopener\" target=\"_blank\"><\/p>\n<p>  <img loading=\"lazy\" decoding=\"async\" alt=\"Das NuGet-Paket Microsoft.AspNetCore.Components.Server.AutoPause (Abb. 3)\" height=\"116\" src=\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='696px' height='391px' viewBox='0 0 696 391'%3E%3Crect x='0' y='0' width='696' height='391' fill='%23f2f2f2'%3E%3C\/rect%3E%3C\/svg%3E\" style=\"aspect-ratio: 1569 \/ 116; object-fit: cover;\" width=\"1569\"\/><\/p>\n<p>      <\/a><\/p>\n<p>Das NuGet-Paket Microsoft.AspNetCore.Components.Server.AutoPause (Abb. 3)<\/p>\n<p>und der Startcode ist um den Aufruf AddAutoPause() zu erweitern:<\/p>\n<p>app.MapRazorComponents()<br \/>\n    .AddInteractiveServerRenderMode()<br \/>\n    .WithBrowserOptions(options =&gt;<br \/>\n    {<br \/>\n        options.AddAutoPause(pause =&gt;<br \/>\n        {<br \/>\n            pause.HiddenDelay = TimeSpan.FromSeconds(60); \/\/ Standard: 2 Minuten<br \/>\n        });<br \/>\n    });<\/p>\n<p>Im Standard geschieht das Pausieren nach zwei Minuten. Diese Zeit k\u00f6nnen Entwicklerinnen und Entwickler mit HiddenDelay \u00e4ndern. Blazor Server h\u00e4lt sich aber nicht akribisch an die definierte Zeitspanne. So wird die Zeit verl\u00e4ngert, wenn ein Eingabesteuerelement neue Werte enth\u00e4lt, wenn die Seite Audio- oder Videoinhalte mit Ton abspielt oder wenn ein JavaScript-Aufruf l\u00e4uft.<\/p>\n<p>      <a href=\"https:\/\/www.heise.de\/imgs\/18\/5\/1\/4\/6\/1\/3\/9\/image4-b0af81465ff206d0.png\" rel=\"nofollow noopener\" target=\"_blank\"><\/p>\n<p>  <img loading=\"lazy\" decoding=\"async\" alt=\"Diese Blazor-Server-Anwendung war f\u00fcr einige Sekunden im Schlaf. Der Benutzer sieht beim R\u00fcckwechseln der Registerkarte kurz den Inhalt von ReconnectModal.razor, dann arbeitet die Anwendung weiter (Abb. 4).\" height=\"1485\" src=\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='696px' height='391px' viewBox='0 0 696 391'%3E%3Crect x='0' y='0' width='696' height='391' fill='%23f2f2f2'%3E%3C\/rect%3E%3C\/svg%3E\" style=\"aspect-ratio: 2562 \/ 1485; object-fit: cover;\" width=\"2562\"\/><\/p>\n<p>      <\/a><\/p>\n<p>Diese Blazor-Server-Anwendung war f\u00fcr einige Sekunden im Schlaf. Der Benutzer sieht beim R\u00fcckwechseln der Registerkarte kurz den Inhalt von ReconnectModal.razor, dann arbeitet die Anwendung weiter (Abb. 4).<\/p>\n<p>Zu beachten ist, dass sich eine Komponente beim Schlafenlegen nur die Werte der mit [PersistentState] annotierten Eigenschaften oder manuell im Persistent Component State gespeicherten Objekte merkt.<\/p>\n<p>CacheView f\u00fcr Blazor Static SSR<\/p>\n<p>Bei dem in .NET 8.0 eingef\u00fchrten statischen serverseitigen Rendering (Static SSR), das man als Abl\u00f6sung f\u00fcr ASP.NET Core MVC und ASP.NET Core Razor Pages verstehen kann, schlie\u00dft Microsoft in .NET 11.0 Preview 7 eine weitere L\u00fccke: Analog <a href=\"https:\/\/learn.microsoft.com\/en-us\/aspnet\/core\/mvc\/views\/tag-helpers\/built-in\/cache-tag-helper\" rel=\"external noopener nofollow\" target=\"_blank\">zu dem Tag Helper<\/a>  in den \u00e4lteren Webframeworks gibt es jetzt in Blazor eine neue eingebaute Komponente . Diese Komponente merkt sich den gerenderten Inhalt f\u00fcr eine bestimmte Zeit und rendert den Inhalt erst nach dem Ablauf erneut. Die Zeitspanne k\u00f6nnen Entwicklerinnen und Entwickler flexibel durch<\/p>\n<p>ExpiresAfter: Zeitspanne seit dem ersten ZugriffExpiresOn: fester Zeitpunkt oderExpiresSliding: Zeitspanne seit dem letzten Zugriff<\/p>\n<p>angeben.<\/p>\n<p>Mit VaryByRoute und VaryByQuery sowie VaryByUser und VaryByCulture l\u00e4sst sich festlegen, dass es abweichende Zwischenspeicher f\u00fcr verschiedene Parameter in URL und QueryString beziehungsweise Benutzer und Sprachen geben soll.<\/p>\n<p>In zwei F\u00e4llen funktioniert die -Komponente nicht:<\/p>\n<p>wenn die HTTP-Anfrage ein anderes Verb als GET verwendet oderwenn Stream Rendering aktiv ist, mit @attribute [StreamRendering].<\/p>\n<p>Zudem l\u00e4sst sich das Zwischenspeichern mit der Eigenschaft enabled=&#187;false&#187; manuell deaktivieren.<\/p>\n<p>Die von Microsoft gelieferte Razor-Komponente  funktioniert nicht innerhalb eines -Elements:<\/p>\n<p>&#171;InvalidOperationException: Component &#8218;Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize`1[[System.DateTime&#8216; cannot be used inside a CacheView because its output depends on per-request state ([CacheBehavior(CacheBehavior.Throw)]) that cannot be safely cached and replayed. To fix this, move the component outside the CacheView.&#187;<\/p>\n<p>Die Komponente  funktioniert nur mit VaryByUser=&#187;true&#187; und das -Tabellensteuerelement nur mit VaryByQuery.<\/p>\n<p>Selbsterstellte Komponenten k\u00f6nnen mit @attribute [CacheBehavior(CacheBehavior.Throw)] angeben, dass sie nicht im  funktionieren wollen. Mit @attribute [CacheBehavior(CacheBehavior.Rerender)] werden Komponenten trotz  immer neu gerendert. Das geschieht auch mit den eingebauten Komponenten  und .<\/p>\n<p>Zwischenspeicher ist im Standard der RAM des Webservers. Durch Einsatz <a href=\"https:\/\/learn.microsoft.com\/de-de\/aspnet\/core\/performance\/caching\/hybrid\" rel=\"external noopener nofollow\" target=\"_blank\">des NuGet-Pakets Microsoft.Extensions.Caching.Hybrid<\/a> sind auch andere Speicher (etwa Redis, Datenbankmanagementsystem) als Zwischenspeicher m\u00f6glich.<\/p>\n<p>@page &#171;\/Cache&#187;<br \/>\n@page &#171;\/Cache\/{URLID:int}&#187;<\/p>\n<p>@code<br \/>\n{<br \/>\n [Parameter]<br \/>\n [SupplyParameterFromQuery]<br \/>\n public int URLID { get; set; }<\/p>\n<p> [Parameter]<br \/>\n [SupplyParameterFromQuery]<br \/>\n public int QueryID { get; set; }<br \/>\n}<\/p>\n<p> URLID: @URLID<br \/>QueryID: @QueryID<br \/>zuletzt aktualisiert am @DateTime.Now<\/p>\n<p><a href=\"&quot;\/Cache\/1&quot;\">\/1<\/a><br \/>\n<a href=\"&quot;\/Cache\/2&quot;\">\/2<\/a><br \/>\n<a href=\"&quot;\/Cache\/3&quot;\">\/3<\/a><br \/>\n<a href=\"&quot;\/Cache\/4&quot;\">\/4<\/a><br \/>\n<a href=\"&quot;\/Cache\/5&quot;\">\/5<\/a><br \/>\n<br \/><a href=\"&quot;\/Cache?QueryID=1&quot;\">QueryID=1<\/a><br \/>\n<a href=\"&quot;\/Cache?QueryID=2&quot;\">QueryID=2<\/a><br \/>\n<a href=\"&quot;\/Cache?QueryID=3&quot;\">QueryID=3<\/a><br \/>\n<a href=\"&quot;\/Cache?QueryID=4&quot;\">QueryID=4<\/a><br \/>\n<a href=\"&quot;\/Cache?QueryID=5&quot;\">QueryID=5<\/a><\/p>\n<p>Listing 2: Beispiel f\u00fcr den Einsatz von <\/p>\n<p>Neue Analyzer sch\u00fctzen vor Fehlern<\/p>\n<p>F\u00fcnf neue in Blazor eingebaute Analyzer warnen Entwicklerinnen und Entwickler vor falschem Programmcode:<\/p>\n<p>BL0012 warnt, wenn ein Aufruf von StateHasChanged() nicht notwendig ist, zum Beispiel in OnInitialized(), OnInitializedAsync() und Ereignisbehandlungen.Wenn GetAuthenticationStateAsync() aufgerufen wird, ohne das Ereignis AuthenticationStateChanged() zu abonnieren, warnt BL0013, weil dadurch eine Komponente mit einem veralteten Authentifizierungsstatus arbeiten kann.BL0014 warnt, wenn eine Z\u00e4hlvariable einer for-Schleife von einer Closure oder einem Render-Fragment erfasst wird. Dadurch k\u00f6nnen alle Callbacks oder Fragmente auf den Wert der letzten Iteration verweisen.Eine mit [JSInvokable] markierte Methode ist nicht \u00f6ffentlich. Sie l\u00e4sst sich zwar kompilieren, kann aber nicht aus JavaScript aufgerufen werden. Der Analyzer BL0015 bietet einen Code-Fix an, der die Methode public macht.Wenn InvokeAsync() oder InvokeVoidAsync() au\u00dferhalb eines try-catch-Blocks aufgerufen wird, warnt BL0016. Bei einer unterbrochenen Blazor-Verbindung oder einer JavaScript-Ausnahme kann dadurch die Komponente beziehungsweise der Circuit beendet werden.<br \/>\nUnion Types als Parameter<\/p>\n<p>Blazor-Komponenten sollen <a href=\"https:\/\/github.com\/dotnet\/core\/blob\/main\/release-notes\/11.0\/preview\/preview7\/aspnetcore.md#razor-accepts-literal-attributes-for-union-typed-component-parameters\" rel=\"external noopener nofollow\" target=\"_blank\">laut Release Notes<\/a> nun auch mit Union Types, <a href=\"https:\/\/www.heise.de\/news\/NET-11-0-Preview-3-bringt-Union-Types-und-erweitert-File-based-Apps-11259243.html\" rel=\"nofollow noopener\" target=\"_blank\">die in Preview 3 eingef\u00fchrt wurden<\/a>, als Parameter reibungslos funktionieren. Im Schnelltest mit dieser Komponente<\/p>\n<p>@code {<\/p>\n<p> public union ContentUnion(string, RenderFragment);<\/p>\n<p> [Parameter]<br \/>\n public ContentUnion? Header { get; set; }<\/p>\n<p> [Parameter]<br \/>\n public ContentUnion? Content { get; set; }<br \/>\n}<\/p>\n<p>\n @Header.Value<br \/>\n @Content.Value\n<\/p>\n<p>Listing 3: Message.razor<\/p>\n<p>und diesem Aufruf<\/p>\n<p> @DateTime.Now.ToShortDateString()<br \/>\n Dies ist fett und das ist kursiv!<\/p>\n<p>gab es jedoch stets den Laufzeitfehler<\/p>\n<p>InvalidOperationException: Object of type &#8218;Message&#8216; does not have a property matching the name &#8218;ChildContent&#8216;.<\/p>\n<p>Die Komponente Message.razor funktioniert hingegen reibungslos, wenn man die Parameter auf RenderFragment statt auf ContentUnion typisiert.<\/p>\n<p>Zahlreiche Breaking Changes gegen\u00fcber den vorherigen Preview-Versionen<\/p>\n<p>Wer schon Blazor-Anwendungen mit in vorherigen Preview-Versionen eingef\u00fchrten Validierungs-Features nutzt \u2013 wie der clientseitigen Validierung, vereinfachten Lokalisierung von Validierungs-Fehlermeldungen und der asynchronen Validierung \u2013, muss in Preview 7 vieles am Programmcode \u00e4ndern, denn Microsoft hat die APIs noch einmal \u00fcberarbeitet.<\/p>\n<p>Ob beim statischen serverseitigen Rendern die clientseitige Validierung aktiv ist, steuert man nun nicht mehr \u00fcber EnableClientValidation=&#187;true&#187;, sondern \u00fcber DisableClientValidation=&#187;false&#187;.<\/p>\n<p>Bei der Lokalisierung ist AddValidationLocalization() entfallen; stattdessen gibt man die Ressource (.resx-Datei) mit den lokalisierten Fehlermeldungen nun bei AddValidation() an:<\/p>\n<p>builder.Services.AddValidation(options =&gt;<br \/>\n{<br \/>\n    options.LocalizerProvider = (_, factory) =&gt; factory.Create(typeof(ValidationMessages));<br \/>\n});<\/p>\n<p>Zum Gl\u00fcck radikal vereinfacht hat Microsoft die asynchrone Validierung, <a href=\"https:\/\/www.heise.de\/news\/NET-11-0-Preview-5-vereinfacht-das-statische-serverseitige-Rendering-in-Blazor-11327634.html\" rel=\"nofollow noopener\" target=\"_blank\">die in Preview 5 eingef\u00fchrt wurde<\/a> und sehr komplex war.<\/p>\n<p>Nun in Preview 7 lassen sich asynchrone Validierungsannotationen schreiben, indem man von der Basisklasse AsyncValidationAttribute erbt. Diese asynchronen Validierungsannotationen verwendet man in einem Objektmodell, das man als EditContext f\u00fcr ein Formular verwendet. Dann kann man in der Instanz von EditContext via IsValidationPending() und IsValidationFaulted() den Status der Validierung abfragen.<\/p>\n<p>Die Annotationen [ValidatableType] und [SkipValidation], <a href=\"https:\/\/www.heise.de\/news\/NET-10-Release-Candidate-1-Nachschlag-fuer-Entity-Framework-Core-10640883.html\" rel=\"nofollow noopener\" target=\"_blank\">die es seit .NET 10.0 gibt<\/a> und seitdem als experimentell galten, erzeugen nun keine solche Warnung mehr.<\/p>\n<p><a href=\"https:\/\/www.heise.de\/news\/NET-11-0-Preview-6-Union-Types-machen-sich-in-den-NET-Bibliotheken-breit-11366944.html\" rel=\"nofollow noopener\" target=\"_blank\">In .NET 11.0 Preview 6<\/a> hatte Microsoft in der Komponente  das programmgesteuerte Scrolling zu einer bestimmten Position eingef\u00fchrt. Daf\u00fcr gab es die neue Eigenschaft InitialIndex f\u00fcr die Startposition und die neue Methode ScrollToIndexAsync() f\u00fcr eine Bewegung zur Laufzeit. Nun wurde die Eigenschaft in InitialItemIndex und die Methode in ScrollToItemAsync() umbenannt. Das -Steuerelement bietet ab Preview 7 auch InitialItemIndex und ScrollToItemAsync an.<\/p>\n<p>Zahlreiche weitere Breaking Changes in ASP.NET Core 11.0 Preview 7 <a href=\"https:\/\/github.com\/dotnet\/core\/blob\/main\/release-notes\/11.0\/preview\/preview7\/aspnetcore.md#breaking-changes\" rel=\"external noopener nofollow\" target=\"_blank\">findet man in den Release Notes<\/a>.<\/p>\n<p>\n      Dieser Link ist leider nicht mehr g\u00fcltig.\n    <\/p>\n<p>Links zu verschenkten Artikeln werden ung\u00fcltig,<br \/>\n      wenn diese \u00e4lter als 7\u00a0Tage sind oder zu oft aufgerufen wurden.\n    <\/p>\n<p>Sie ben\u00f6tigen ein heise+ Paket, um diesen Artikel zu lesen. Jetzt eine Woche unverbindlich testen \u2013 ohne Verpflichtung!<\/p>\n","protected":false},"excerpt":{"rendered":".NET 11.0 Preview 7 gibt es kostenfrei zum Download bei Microsoft. Dabei handelt es sich um die letzte&hellip;\n","protected":false},"author":2,"featured_media":249597,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_share_on_mastodon":"0"},"categories":[15],"tags":[42854,53745,53746,53747,36923,46,622,560,31743,45,60,59,44,64,61,63,62],"class_list":["post-249596","post","type-post","status-publish","format-standard","has-post-thumbnail","category-wissenschaft-technik","tag-net","tag-net-11-0","tag-asp-net","tag-blazor","tag-c","tag-ch","tag-it","tag-microsoft","tag-passkey","tag-schweiz","tag-science","tag-science-technology","tag-switzerland","tag-technik","tag-technology","tag-wissenschaft","tag-wissenschaft-technik"],"share_on_mastodon":{"url":"https:\/\/pubeurope.com\/@ch_de\/117089026141782481","error":""},"_links":{"self":[{"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/posts\/249596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/comments?post=249596"}],"version-history":[{"count":0,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/posts\/249596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/media\/249597"}],"wp:attachment":[{"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/media?parent=249596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/categories?post=249596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/tags?post=249596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}