<asp:HiddenField ID="hfValue" runat="server" Value="<%= ServerValue %>" />
<script>
var value = document.getElementById("hfValue").value;
</script>
優點: 類型安全、支援複雜對象序列化(JSON)、不污染全局命名空間。
缺點: 需額外 DOM 查詢、ViewState 增加頁面體積。
<script>
// 數值/布爾/對象字面量
var num = <%= NumProperty %>;
var flag = <%= IsEnabled %>;
var obj = <%= JsonSerializer.Serialize(Model) %>;
// 字符串必須加引號
var str = "<%= StringProperty %>";
alert("<%= Message %>");
</script>
前提條件:
public 屬性/字段(非私有變量)public string Num { get; set; }// 正確方式:Attributes 添加客戶端事件
btnDelete.Attributes.Add("onclick", "return confirm('確定刪除?');");
// CheckBox 特殊處理:OnCheckedChanged 為伺服器事件
// 客戶端用 onclick,伺服器用 OnCheckedChanged
chkAgree.Attributes.Add("onclick", "handleAgreeChange(this);");
<select id="ddlMonth" runat="server">...</select>
// 後台代碼
var ddl = this.FindControl("ddlMonth") as HtmlSelect;
int index = ddl.SelectedIndex;
string value = ddl.Value;
關鍵: 添加 runat="server" 並用 FindControl 強制轉型對應 HTML 控件類型(HtmlSelect、HtmlInputText 等)。
// 後台
public string UserId = "zhangsan";
public UserInfo CurrentUser = new UserInfo { Name = "張三", Role = "Admin" };
// 前台
<script>
// 簡單類型
var userId = "<%= UserId %>";
// 複雜對象:序列化為 JSON
var user = <%= new JavaScriptSerializer().Serialize(CurrentUser) %>;
console.log(user.Name); // "張三"
</script>
核心原則: 將伺服器端數據序列化為 JavaScript 識別的字面量(字符串、數字、布爾、對象、陣列)。
「JavaScript 擅長客戶端交互、DOM 操作、即時反饋;ASP.NET 擅長業務邏輯、資料存取、安全驗證。良好結合,事半功倍。」
| 問題 | 原因 | 解決 |
|---|---|---|
| JS 讀取變量為 undefined | 變量非 public 或拼寫錯誤 | 確保 public 屬性,檢查大小寫 |
| 字符串語法錯誤 | 未加引號或包含換行/引號 | 用 HttpUtility.JavaScriptStringEncode 編碼 |
| CheckBox 事件不觸發 | 混淆客戶端 onclick 與伺服器 OnCheckedChanged | 分離綁定:Attributes.onclick + OnCheckedChanged |
| HTML 控件找不到 | 缺少 runat="server" 或 ID 錯誤 | 添加 runat="server",確保 ID 一致 |