Mit .NET 8 liefert Microsoft einen neuen Rendermodus für Blazor aus, der defacto die Funktion von Razor Pages abdeckt. Server Side Static Rendering nutzt klassische HTTP und fetch um HTML Fragmente vom Webserver nach zu laden und kein Websocket Protokoll.
Der Grund liegt vermutlich darin, Teile der Blazor App mehr wie eine statische Website wirken zu lassen und am Ende auch google zu gefallen. Bei der neuen Social Media Plattform Link by ppedv, habe ich vorerst die Einstiegseite auf statisches Rendering umgestellt. Alles was man tun muss, ist eigentlich nichts da SSSR der Standard Modus von Blazor ist. Außer man gibt andere Anweisungen.
Und genau das tut das Standard Visual Studio Template dann auch und setzt in der app.razor u.a.
<Routes @rendermode="InteractiveServer" />
Diesen Eintrag haben ich entfernt und mir zunächst wenig dabei gedacht. Link hat eine Suchfunktion nach Namen, Skills oder Firmen. Diese war plötzlich ohne Funktion. Betrachten wir den Prototyp eines Suchdialoges. Ich packe den in der Regel in ein Form Element um per Enter Taste den Submit auszulösen.
<form method="post" @onsubmit="onsubmit" >
<input @bind-value="eingabe" />
<button type="submit">submit</button>
</form>
@eingabe
Die wenig aufregende c# Logik dazu in der Blazor Componente
1: string eingabe { get; set; }
2: void onsubmit()
3: {
4:
5: }
Entfernt man nun den Rendermode Eintrag und liefert damit SSSR HTML aus erhält man die Strafe auf den Fuß
A valid antiforgery token was not provided with the request. Add an antiforgery token, or disable antiforgery validation for this endpoint.
Microsoft offeriert eine <AntiforgeryToken /> Componente, die man in das Form einfügen muss. Die nächste Ohrfeige folgt
The POST request does not specify which form is being submitted. To fix this,
ensure <form> elements have a @formname attribute with any unique value,
or pass a FormName parameter if using <EditForm>.
OK fügen wir eben einen @formname="form1" ein. Allerdings bleibt das Formular leer, Die Doku meint, das ein [SupplyParameterFromForm] vor dem Eingabe Parameter von Nöten ist.
Reicht noch immer nicht. Statt dem HTML Input Element muss man die InputText Componen nutzen. Allerdings benötigt man kein EditForm, sondern bleibt beim HTML Form.
In Fiddler kann man nun erkennen, das ein HTTP Post ausgelöst wird.
Man sieht aber auch, das nach wie vor einen Blazor Socket Connection erstellt wird. SSSR und SSR Blazor lassen sich mischen, wenn der Host, also das umrahmende HTML statisch ist.
Der vollständige HTML Teil
1: <form method="post" @onsubmit="onsubmit" @formname="form1">
2: <AntiforgeryToken />
3: <InputText @bind-Value="eingabe" />
4: <button type="submit">submit</button>
5: </form>
und die C# Lösung
1: [SupplyParameterFromForm]
2: string eingabe { get; set; }
3: void onsubmit()
Derartig gestalteter Blazor Code ist nun multi Render Mode fähig. Ohne Änderungen als Interaktiv Server oder statisch.