父頁面以 window.open 開啟子頁面(如新增/編輯對話框),子頁面完成儲存後關閉,父頁面需自動更新 GridView、Repeater 等資料繫結控制項,且不整頁重新載入。
style="display:none"),綁定 OnClick 伺服器端事件執行資料重繫。btnFreshData() 呼叫 click() 觸發該隱藏按鈕的 PostBack。window.opener 呼叫父頁面函式,再自我關閉。
// 後置碼
protected void btnFresh_Click(object sender, EventArgs e)
{
BindGridView(); // 重新查詢繫結
}
// 儲存成功後的後置碼
protected void btnSave_Click(object sender, EventArgs e)
{
// ... 執行儲存邏輯 ...
// 註冊啟動腳本:呼叫父頁面刷新 -> 關閉自身
string script = @"
if (window.opener && window.opener.btnFreshData) {
window.opener.btnFreshData();
}
window.close();
";
ClientScript.RegisterStartupScript(this.GetType(), "closeAndRefresh", script, true);
}
| 痛點 | 改良方案 |
|---|---|
| 彈出視窗被瀏覽器攔截 | 改用 Modal Dialog (Bootstrap Modal, jQuery UI Dialog, SweetAlert2) 同頁面載入 |
| PostBack 導致頁面閃爍 | 採用 AJAX / Fetch API 非同步儲存,成功後父頁面局部更新 DOM |
| 跨域/同源策略限制 | 同網域下正常;跨域需 postMessage 通訊 |
| UpdatePanel 效能較差 | 改用 Web API + 前端框架 (Vue/React/Blazor) 完全分離關注點 |
// 父頁面
function refreshGrid() {
$.get("DataHandler.ashx", function(html) {
$("#gvContainer").html(html); // 替換局部 HTML
});
}
// 子頁面 (iframe 或 modal 中的表單)
$("#btnSave").click(function() {
$.post("SaveHandler.ashx", $("#form").serialize(), function(res) {
if (res.success) {
window.parent.refreshGrid(); // 父頁面函式
closeModal(); // 關閉對話框
}
});
});