Add a timesheet entry
This box is a Blazor component (.razor) inside an MVC page. If it can't connect to the server, Save does nothing: that is the fragility described below.
Why it was abandoned
Razor Components in .NET 8 are designed for Blazor-first apps, not MVC. The hybrid story is "supported", but in practice:
- the pipeline order is fragile;
- hydration fails silently;
- errors hide behind
_framework/blazor.server.js; - namespaces, routing order and antiforgery all matter;
- the hub must be mapped in the right place, and the root component must exist;
- the layout must not interfere, and MVC tag helpers can break hydration.
Too brittle, so the next step went straight to Blazor (see the Blazor Server version).
Three front ends, one core
The same application layer (models, repository, services, validation) in Timesheet.Core, used by three different UIs:
-
MVC Classic Controllers and Razor views, full page posts. Also has Microsoft Entra ID sign-in.
-
Blazor Server Interactive components over a SignalR connection, no page reloads.
-
MVC + Razor Componentsyou are here MVC pages hosting Blazor components (abandoned experiment).
How it's built
- C# .NET, on Azure App Service.
- Each front end has its own Azure DevOps pipeline that runs the unit tests, then deploys.
- Data is held in memory, so changes last only while the app is running.
- Git repository on Azure DevOps