搜尋「WebForm Core .NET」會同時掉進三個專案。它們都提到 Web Forms,也都跑在新的 .NET 上,解決的問題卻不一樣。先把地圖畫出來,後面才不會把 A 的安裝步驟套到 B 的頁面上。

同一次搜尋裡的三個專案。卡片高度只是示意,中間那張與右邊那張的公開成熟度並不相同。

Elanat 的 WebForms Core

Elanat 把「伺服器上的 類別」和「瀏覽器上的 WebFormsJS」之間的這段通訊,命名為 WebForms Core。官方教學寫得很直接:用戶端由 WebFormsJS 管理,伺服器端的 類別把 Action Control 送給它。

它被包在 CodeBehind 裡,但協定本身不綁定 CodeBehind。GitHub 上的 說明,各語言的類別都從 C# 類別衍生,NuGet 上也有獨立套件 。所以你可以:

  • 在 CodeBehind 的 與 Controller 裡呼叫 ;

  • 在 ASP.NET Core Razor Pages 裡把指令寫進回應或 HTML 註解;

  • 只用一個靜態 HTML,加上 ,由任何後端回傳以 開頭的文字。

畫面上的 HTML 保持你寫的那樣。函式庫不會為了自己再生成一套控制項標籤。官方把這點稱為對 HTML 忠實:除了在 引入腳本,頁面不必為了這套技術改寫結構。

WebFormsForCore:讓舊站在 .NET 10 上跑

WebFormsForCore 是另一個開源專案,目標寫在首頁第一段:把 .NET Framework 的 程式庫移植到 .NET 10,讓既有 Web Forms 網站直接在 ASP.NET Core 裡跑,也包含 Linux。作者用它把 FuseCP 控制台遷上去,動機是不想把整套畫面改寫成 Blazor。

你會在這裡看到 、、Session、。這些都是舊生命週期的延續。它不使用 這份 INI 協定。

WebFormsCore:受 Web Forms 啟發的新框架

GitHub 組織 的公開說明把它定義成 ASP.NET Core 10 以上的框架,靈感來自 Web Forms,但不是直接移植,而且有許多破壞性變更。模板指令是:

dotnet new install WebFormsCore.Templates
dotnet new wfc -n MyWebFormsApp

註冊方式是 、、。它討論 、一頁多表單、範圍表單。這些詞彙更接近經典 Web Forms,而不是 Elanat 的 Action Control。

這個儲存庫的公開頁面很短,星標也少。第 12 章只根據 README 裡已經寫出來的安裝與頁面宣告來介紹,不補上文件沒有的生命週期細節。

對照

@lYYY@ & WebForms Core & WebFormsForCore & WebFormsCore
想解決的事 & 用伺服器指令更新 HTML & 舊 Web Forms 繼續跑 & 用熟悉的頁面模型寫新站
畫面技術 & 你自己的 HTML + WebFormsJS & 伺服器控制項、 & 與控制項樹
典型回應 & 以 開頭的文字 & 整頁 HTML 或局部更新 & 框架自己的頁面輸出
ViewState & 官方教學明確說不使用 & 沿用 Web Forms 模型 & README 提供
和 ASP.NET Core 的關係 & Middleware 之上的協定 & 取代 的移植層 & 自己的 endpoint 對應

微軟官方的遷移文件走的是第四條路,而且不叫 WebForms Core:把 Web Forms 改寫到 Blazor、Razor Pages 或 MVC,或以 YARP 並存、逐頁替換。那條路解決的是「離開 」。本書主線解決的是「還想用伺服器來驅動畫面,但不要 ViewState 與整頁重繪」。

後面若沒有特別標出專案全名,「WebForms Core」都指 Elanat 的協定與 類別。移植舊站時會寫全名 WebFormsForCore。