ASP.NET 是微軟在 .NET 平台上的網頁開發框架,2002 年推出,主要語言是 C#。它經歷過一次大改版:2016 年起的 ASP.NET Core 跨平台、開放原始碼、可以跑在 Linux,而舊的 ASP.NET(.NET Framework)則只在 Windows 上維護。今天說「ASP.NET」,九成情況指的是 ASP.NET Core。這篇文章整理兩條產品線的差別、Web Forms 與 Razor Pages 的語法範例、表單與資料庫存取,以及版本支援現況,幫您判斷它適不適合您的專案。本文屬於《網頁程式語言》系列,總覽請見〈網頁程式設計入門〉。
一、ASP.NET 是什麼?
ASP.NET 是微軟開發的開放原始碼網頁框架,用 C#(或 F#、VB.NET)撰寫伺服器端程式,產生網頁、API 與即時服務。它是 .NET 平台的一部分,程式需要先編譯,執行效能與型別安全都優於直譯式腳本。名字裡的 ASP 來自它取代的前身 Classic ASP,但兩者的程式碼互不相容,只是品牌延續。
ASP.NET 提供幾種不同的寫法(微軟稱為應用程式模型):早期的 Web Forms 用「控制項拖拉+事件」模擬桌面程式;2009 年起的 MVC 把程式分成 Model、View、Controller;ASP.NET Core 時代的主流則是 Razor Pages(以頁面為單位)、MVC、Web API(純後端 API)與 Blazor(用 C# 寫前端互動)。名稱很多,但核心都是同一套 .NET 執行環境與 C# 語言。
二、兩條產品線:ASP.NET 與 ASP.NET Core
2016 年是分水嶺:之前的 ASP.NET 建立在只能跑 Windows 的 .NET Framework 上;之後的 ASP.NET Core 重寫核心,跨平台且開放原始碼。微軟已明確表示 .NET Framework 4.8 是最後一個主要版本,只隨 Windows 提供安全性更新,所有新功能都在 ASP.NET Core。
- ASP.NET(.NET Framework 4.x):Web Forms(.aspx)、MVC 5、Web API 2。只能部署在 Windows 與 IIS。既有企業系統大量使用,微軟持續提供安全性修補,但 Web Forms 不會被移植到 Core。
- ASP.NET Core(.NET 8、9、10):Razor Pages、MVC、Minimal API、Blazor、SignalR。可部署在 Windows、Linux、macOS、容器與各家雲端,內建 Kestrel 網頁伺服器,效能是微軟公開強調的重點。
三、基本語法範例:Web Forms 與 Razor Pages
先看許多舊教材與既有系統使用的 Web Forms 內嵌寫法,再看同樣的事在 Razor Pages 怎麼寫,您就能一眼分辨手上的專案屬於哪一代。
1. 輸出文字與變數(Web Forms 傳統寫法)
<%@ Page Language="C#" %>
<!DOCTYPE html>
<html lang="zh-Hant">
<body>
<h2>ASP.NET C# 範例</h2>
<%
string name = "王小明";
int number = 5;
Response.Write("名字:" + name + "<br>");
Response.Write("數字:" + number);
%>
</body>
</html>
<%@ Page Language="C#" %> 宣告這一頁用 C#;<% %> 裡是 C# 程式,語法看起來很像 Classic ASP,但這裡的變數有型別(string、int),寫錯型別在編譯階段就會被抓出來。
2. 條件判斷與迴圈
<%
int age = 20;
if (age >= 18)
{
Response.Write("您已成年");
}
else
{
Response.Write("您尚未成年");
}
for (int i = 1; i <= 5; i++)
{
Response.Write("這是第 " + i + " 次迴圈<br>");
}
%>
C# 的流程控制與 Java、JavaScript 幾乎相同:大括號包區塊、敘述以分號結尾、嚴格區分大小寫。
3. 同一件事的 Razor Pages 寫法
ASP.NET Core 的 Razor 語法用 @ 切換到 C#,比 <% %> 簡潔得多,而且畫面(.cshtml)與邏輯(.cshtml.cs)分成兩個檔案:
@page
@model IndexModel
<h2>ASP.NET Core 範例</h2>
<p>名字:@Model.Name</p>
@if (Model.Age >= 18)
{
<p>您已成年</p>
}
else
{
<p>您尚未成年</p>
}
<ul>
@for (int i = 1; i <= 5; i++)
{
<li>這是第 @i 次迴圈</li>
}
</ul>
public class IndexModel : PageModel
{
public string Name { get; set; } = "王小明";
public int Age { get; set; } = 20;
public void OnGet()
{
// 頁面以 GET 載入時執行,例如從資料庫讀資料
}
}
Razor 會自動把 @Model.Name 這類輸出做 HTML 編碼,預設就防止了跨站腳本(XSS),這是它比 Response.Write 安全的地方。
四、表單處理與資料庫存取
表單靠模型繫結,資料庫靠 Entity Framework Core 或 ADO.NET。Razor Pages 的表單處理如下,注意 [BindProperty] 會自動把欄位值填進屬性:
@page
@model ContactModel
<form method="post">
姓名:<input asp-for="Name"><br>
<button type="submit">送出</button>
</form>
@if (!string.IsNullOrEmpty(Model.Message))
{
<p>@Model.Message</p>
}
public class ContactModel : PageModel
{
[BindProperty]
public string Name { get; set; } = "";
public string Message { get; set; } = "";
public void OnPost()
{
Message = $"您輸入的姓名是:{Name}";
}
}
資料庫部分,多數新專案用 Entity Framework Core 以物件方式操作資料表;若要直接下 SQL,ADO.NET 的寫法如下,重點是用 SqlParameter 帶參數:
using Microsoft.Data.SqlClient;
var connectionString = configuration.GetConnectionString("Default");
var results = new List<string>();
using (var conn = new SqlConnection(connectionString))
using (var cmd = new SqlCommand("SELECT Id, Name FROM Users WHERE Status = @status", conn))
{
cmd.Parameters.AddWithValue("@status", 1);
conn.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
results.Add($"ID:{reader["Id"]},名字:{reader["Name"]}");
}
}
}
appsettings.json 而不是寫在程式裡;套件用 Microsoft.Data.SqlClient 而不是舊的 System.Data.SqlClient;所有外部輸入一律用參數帶入 SQL,字串串接是 SQL 注入的主要來源。
五、ASP、ASP.NET、ASP.NET Core 三者對照表
三個名字常被混用,這張表一次釐清。Classic ASP 的語法與現況另有〈ASP 是什麼〉專文。
| 項目 | Classic ASP | ASP.NET(.NET Framework) | ASP.NET Core |
|---|---|---|---|
| 推出年份 | 1996 | 2002 | 2016 |
| 語言 | VBScript、JScript | C#、VB.NET | C#、F# |
| 執行方式 | 直譯 | 編譯 | 編譯 |
| 作業系統 | Windows(IIS) | Windows(IIS) | Windows、Linux、macOS、容器 |
| 副檔名 | .asp | .aspx、.cshtml(MVC 5) | .cshtml、.razor |
| 開放原始碼 | 否 | 部分 | 是(MIT 授權) |
| 現況 | 維護模式,2000 年後無新版 | 4.8 為最後主要版本,只有安全性更新 | 所有新功能都在這裡 |
| 適合 | 僅維護既有系統 | 既有 Web Forms 系統維護 | 所有新專案 |
六、版本與支援現況(2026)
.NET 每年 11 月發布一版,偶數版是長期支援(LTS)三年,奇數版是標準支援(STS)期間較短。依微軟的支援政策頁面,2026 年的情況是:
- .NET 8(LTS):2023 年 11 月發布,支援到 2026 年 11 月,是目前最多既有 ASP.NET Core 專案所在的版本,年底前需規劃升級。
- .NET 10(LTS):2025 年 11 月發布,支援到 2028 年 11 月,新專案應直接採用。
- .NET 9(STS):2024 年 11 月發布,支援期較短,屬過渡版本。
- .NET Framework 4.8 與 4.8.1:最後的主要版本,作為 Windows 元件隨作業系統支援,沒有新功能;Web Forms 專案會停在這裡。
實務上的判斷:新專案用 .NET 10;.NET 8 的專案在 2026 年內升到 10,LTS 之間升級通常改動不大;Web Forms 系統則要決定是繼續維護還是改寫成 Razor Pages 或 Blazor,因為它沒有升級到 Core 的路。
七、誰適合用 ASP.NET?主機與成本怎麼看
ASP.NET Core 適合已在微軟生態(SQL Server、Azure、Active Directory)的企業,以及需要高效能 API 或複雜商業邏輯的系統;對以官網與內容行銷為主的中小企業,PHP 仍是成本最低的選擇。從網頁設計公司的角度,決定因素通常不是語言優劣,而是:
- 主機:ASP.NET Core 可跑 Linux,主機選擇已不再是問題;但 Web Forms 與 .NET Framework 專案仍需 Windows 主機,租金普遍高於 Linux 的 PHP 主機。
- 團隊:公司內部已有 C# 工程師(常見於製造業與金融業的 IT 部門)時,用 ASP.NET 延伸出 Web 系統最順;反之要另外找 .NET 外包,人力成本高於 PHP。
- 系統性質:需要與 ERP、Windows 網域帳號整合的內部系統,ASP.NET 有天然優勢;純資訊展示與詢問單的官網,任何語言都做得到,重點在技術 SEO與內容。
本站(newscan.com.tw)以 PHP 與 MySQL 建置,是依上述第一與第三點做的選擇,並非 ASP.NET 不好。伺服器端語言與網站排名沒有直接關係,Google 看的是輸出的 HTML、速度與內容品質。
八、結論
ASP.NET 是微軟以 C# 為核心的網頁框架,現在的主線是跨平台的 ASP.NET Core;舊的 Web Forms 只剩維護價值。學習它請直接從 .NET 10 的 Razor Pages 或 Minimal API 開始,並把 C# 基礎打穩,因為框架年年更新、語言才是不變的部分。
想釐清它與前身的關係,見〈ASP 是什麼〉;想比較不同伺服器端語言的取捨,回到〈網頁程式設計入門〉;前端互動仍然離不開 JavaScript,Blazor 只是把其中一部分換成 C#。
九、常見問答 FAQ
ASP.NET 是什麼?
ASP.NET 和 ASP 差在哪?
ASP.NET Core 和 ASP.NET 有什麼不同?
學 ASP.NET 要先會 C# 嗎?
ASP.NET 網站需要 Windows 主機嗎?
參考來源
- Microsoft Learn,〈ASP.NET Core 概觀〉,Microsoft 官方文件。
- Microsoft Learn,〈選擇 ASP.NET 4.x 或 ASP.NET Core〉,Microsoft 官方文件。
- Microsoft,〈.NET and .NET Core Support Policy〉,Microsoft 官方支援政策。
- Microsoft Learn,〈ASP.NET Core 中的 Razor Pages 簡介〉,Microsoft 官方文件。
- 新視野網頁設計,〈ASP 是什麼?Classic ASP 語法介紹、與 ASP.NET 的差別及現況〉,本站自有內容。
.NET 各版本支援期限依 2026 年 9 月查閱的微軟支援政策頁面整理,以微軟公告為準;第七節為本站規劃網站技術架構時的實務判斷,不涉及特定客戶資料。