ASP.NET MVC 是伺服器端 MVC 框架,透過 URL 路由對應 Controller/Action,每次互動皆回傳完整新頁面。這與前端 MVC(如 Backbone.js、Ember.js)的單頁應用(SPA)模式有本質差異。
以 StoreManagerController 為例:
public class StoreManagerController : Controller {
private MusicStoreEntities db = new MusicStoreEntities();
public ViewResult Index() {
var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
return View(albums.ToList());
}
public ViewResult Details(int id) {
Album album = db.Albums.Find(id);
return View(album);
}
}
URL 規則 {controller}/{action}/{id} 決定路由,每個 Action 回傳 ViewResult,即完整 HTML 頁面。GitHub 即為典型代表:每次點擊對應唯一 URL,極少使用 JavaScript 互動。
前端 SPA 中,URL 對應的是頁面區塊或功能(如 #todo/add、#todo/edit/123)。但當功能組合爆炸(如篩選狀態下的新增/編輯/刪除),路由組合數會指數級增長,導致路由設定極度複雜:
var TodoRouter = Backbone.Router.extend({
routes: {
'todo/add': 'add',
'todo/edit/:id': 'edit',
'filter/completed': 'filterCompleted',
'filter/uncompleted': 'filterUncompleted'
}
});
若需支援「已完成篩選下新增」,需新增 filter/completed/todo/add 等組合路由,排列組合下維護成本極高。
| 面向 | 伺服器端 MVC | 前端 MVC (SPA) |
|---|---|---|
| URL 對應 | 完整頁面 | 頁面區塊/功能 |
| 狀態管理 | 無狀態,每請求重建 | 客戶端保持狀態 |
| 路由複雜度 | 線性增長 | 組合爆炸風險 |
這也是現代架構傾向「後端 API + 前端 SPA」分離的原因:後端專注資料與業務邏輯,前端專注使用者體驗與狀態管理。