Web Application 開 發 利 器 - WebSnap(六)

类别:Delphi 点击:0 评论:0 推荐:

Web Application 開 發 利 器 - WebSnap!

第 六 章 、 執 行 者 : TAdapterDispatcher 及 AdapterAction

 

 6-1 Action 的 運 作 原 理

 

  在 第 一 章 的 Modules 中 我 們 稍 微 討 論 了 Dispatcher 在 整 個 WebSnap 中 扮 演 著 那 一 種 角 色 , 除 了 PageDispatcher 是 用 來 導 向 某 個 網 頁 外 , WebSnap 中 還 有 另 一 個 很 重 要 的 Dispatcher 元 件 : TAdapterDispatcher , 還 記 得 我 們 使 用 ActionButton 前 必 須 要 設 定 她 的 ActionName 特 性 值 嗎 ? 這 就 是 供 TAdapterDispatcher 使 用 的 資 訊 , 你 在 使 用 了 ActionButton 的 網 頁 中 應 該 會 看 到 類 似 下 面 的 Script 程 式 碼 :

 

<input type="submit" value="EditRow" onclick="AdapterForm1.__act.value='<%=vdsAdaptCust_EditRow.LinkToPage("Edit", Page.Name).AsFieldValue%>'">

 

轉 成 網 頁 後 會 變 成 下 面 這 段 HTML 程 式 碼 :

 

<input type="submit" value="Query" onclick="AdapterForm2.__act.value='__sp.4.Edit__fp.5.Error__id.19.Grid.Adapter1.Query'">

 

onclick 內 的 字 串 會 被 送 往 TAdapterDispatcher , 她 再 藉 由 藍 色 字 的 部 份 解 出 Action 資 訊 。 __sp 代 表 的 是 Action 執 行 成 功 後 轉 向 的 網 頁 名 稱 , __fp 則 是 失 敗 後 轉 向 的 網 頁 名 稱 , 在 這 裡 沒 有 出 現 的 另 一 個 __cp 則 是 目 前 網 頁 名 稱 。 Grid.Adapter1.Query 就 是 Action 的 名 稱 與 所 在 的 Module 及 Adapter , 接 著 TAdapterDispatcher 會 藉 著 Grid.Adapter1.Query 字 串 來 搜 尋 出 正 確 的 Module 並 建 立 她 。 看 到 這 裡 你 應 該 有 點 概 念 了 , 建 立 Module 後 就 是 取 得 Adapter 並 執 行 Query 這 個 Action 了 。 那 為 何 要 將 成 功 與 失 敗 的 網 頁 也 存 到 這 個 字 串 中 呢 ? 這 帶 出 了 Action 的 另 一 面 , 技 術 上 而 言 , 你 可 能 會 因 為 適 應 情 況 的 不 同 在 程 式 中 改 變 Action 中 這 兩 個 特 性 值 , 但 是 這 可 能 會 造 成 一 些 問 題 。 例 如 執 行 Action 這 一 個 動 作 時 沒 有 通 過 你 的 這 段 程 式 碼 , 那 麼 這 兩 個 特 性 值 就 變 成 了 預 設 值 了 , 執 行 後 當 然 是 錯 誤 收 場 , 所 以 Action 提 供 了 OnGetParam 及 OnExecute 兩 個 事 件 , 當 Action 被 顯 示 前 , 也 就 是 說 輸 出 成 上 面 那 段 字 串 之 前 會 觸 發 OnGetParam 事 件 , 你 可 以 在 裡 面 加 上 你 要 保 留 的 參 數 , 在 這 個 Action 被 執 行 時 這 些 參 數 就 會 被 送 往   OnExecute 事 件 了 , 請 看 下 圖 :

( 圖 :7)

我 們 可 以 在 OnExecute 這 個 事 件 中 將 參 數 取 出 並 作 出 正 確 的 回 應 動 作 , 有 了 這 些 概 念 後 我 們 就 可 以 解 釋 下 面 這 段 碼 的 意 義 了 :  

<input type="submit" value="EditRow" onclick="AdapterForm1.__act.value='_lCustNo.4.1356__sp.4.Edit__fp.4.Grid__id.24.Grid.dsAdaptCust.EditRow'">

上 面 這 段 碼 來 自 於 我 們 的 Grid Page 中 , 除 了 之 前 我 們 談 過 的 參 數 外 , 你 還 可 以 看 到 _l 這 個 值 , 這 是 一 個 Key 值 , 用 來 在 Action 執 行 時 將 DataSet 的 記 錄 移 往 這 一 筆 , 當 EditRow Action 將 網 頁 導 向 Edit PageModule 時 就 可 以 顯 示 出 正 確 的 記 錄 了 , 最 後 讓 我 們 看 一 下 Edit 的 Apply Action 的 值 :

<input type="submit" value="Apply" onclick="AdapterForm1.__act.value='_lCustNo.4.1221__sp.4.Grid__fp.4.Edit__id.22.Edit.dsAdaptCust.Apply'">

你 應 該 能 解 釋 這 個 Action 了 吧 , 不 過 單 單 只 有 這 個 Action 是 無 法 解 釋 整 個 Apply 動 作 的 , 熟 悉 網 頁 設 計 的 人 都 知 道 , 當 我 們 在 處 理 資 料 庫 的 網 頁 時 , 我 們 會 將 記 錄 的 原 值 以 Hidden Field 狀 態 存 放 在 網 頁 中 , 當 使 用 者 Apply 之 後 , 我 們 再 將 原 值 與 控 制 項 中 的 新 值 做 比 對 , 接 著 利 用 這 些 原 值 來 取 得 正 確 的 記 錄 並 儲 存 。 要 了 解 WebSnap 處 理 這 個 流 程 的 整 個 動 作 , 我 們 必 須 從 Edit 網 頁 中 這 段 Script 程 式 開 始 :

<input type="hidden" name="__am.dsAdaptCust" value="Edit">

<input type="hidden" name="__ov.CustNo" value="1221">

… … … … ..

<input type="hidden" name="__key." value="CustNo.4.1221">

我 們 先 看 到 __am 這 一 行 , 這 一 行 就 是 你 在 FieldGroup 中 的 AdapterMode 設 定 , WebSnap 用 這 一 行 來 判 別 Action 發 生 時 AdapterMode 是 處 於 那 一 種 狀 態 。 下 面 的 __ov 則 是 CustNo 的 原 值 , 接 著 __key 這 一 行 你 應 該 知 道 是 作 何 用 途 的 吧 , 但 你 可 能 會 疑 惑 , 為 何 有 兩 個 同 樣 用 途 的 值 存 在 呢 ? Action 中 不 是 已 經 有 這 個 值 了 嗎 ? 你 還 記 得 MasterDetailEdit 網 頁 中 我 們 允 許 使 用 者 在 裡 面 編 修 多 筆 明 細 資 料 嗎 ? 你 可 以 試 著 改 變 一 筆 以 上 的 記 錄 後 按 下 任 一 筆 記 錄 後 的 Apply 欄 位 , 你 會 發 現 所 有 的 編 修 都 被 接 受 了 , 如 果 只 有 一 個 Action 內 的 Key 值 是 辦 不 到 的 不 是 嗎 ? 這 就 是 這 個 值 存 在 的 意 義 。 如 果 你 觀 察 MasterDetailEdit 內 的 Action 及 HiddenFields , HiddenRecordFields 資 訊 的 話 , 你 會 發 現 到 在 Action 與 __key 值 內 也 包 含 了 Master-Detail Key 的 資 訊 , 到 這 裡 為 止 , 你 應 該 能 夠 理 解 Action 是 如 何 動 作 的 , 又 為 何 這 樣 設 計 , 你 也 可 以 撰 寫 自 定 的 Action 來 簡 化 你 的 工 作 , 這 些 我 們 留 待 在 Inside WebSnap 篇 再 詳 細 討 論 了 。

  

6-2 神 秘 的 Action: DefaultAction

 

當 你 利 用 設 定 Action 的 PageName 來 轉 向 某 一 個 Page Module 時 , 如 果 該 Page Module 中 設 定 了 DefaultAction 的 話 , 你 可 以 利 用 Action 中 的 RedirectOptios 特 性 值 來 決 定 是 否 觸 發 DefaultAction:

 

 

當 你 設 定 Action 的 RedirectOptios 為 roRedirectHTTPPost 時 , 當 執 行 Action 轉 向 該 Page Module 時 就 會 觸 動 該 Page Module 中 的 DefaultAction 事 件 , 但 有 一 點 必 須 要 小 心 , 當 DefaultAction 中 的 Action 也 設 定 為 roRedirectHTTPPost 時 會 進 入 無 窮 迴 圈 , 這 個 技 術 可 以 用 在 使 用 者 執 行 Action 後 將 她 導 向 此 網 頁 時 , 在 目 的 網 頁 輸 出 前 執 行 一 些 初 使 化 動 作 , 與 OnBeforeDispatchPage 不 同 , 她 只 在 Action 或 是 呼 叫 RedirectToPage 導 向 時 被 啟 動 , OnBeforeDispatchPage 則 是 在 網 頁 輸 出 前 被 啟 動 , 使 用 DefaultAction 或 是 OnBeforeDispatchPage 需 視 你 的 需 求 而 定 , 如 果 你 初 始 化 動 作 必 需 在 網 頁 輸 出 前 初 始 化 , 那 你 應 該 寫 在 OnBeforeDispatcher , 如 果 你 需 要 在 Action 導 向 時 或 是 明 白 呼 叫 RedirectToPage 轉 向 時 處 理 一 些 初 始 化 動 作 的 話 , 使 用 DefaultAction 會 是 較 好 的 選 擇 , 當 然 ! 實 務 上 這 兩 者 有 可 能 都 會 用 到 , 這 時 要 小 心 , 兩 者 有 可 能 都 會 被 觸 發 , DefaultAction 的 OnExecute 是 第 一 個 被 觸 發 的 動 作 , 接 著 才 是 OnBeforeDispatchPage 。

 

本 章 後 記

這 一 章 中 我 與 你 討 論 了 Action 在 WebSnap 中 的 定 義 及 運 作 流 程 , 還 有 WebSnap 如 何 與 Hidden Field 互 動 , 這 些 資 訊 對 於 你 探 索 Action 或 撰 寫 Action 元 件 是 很 有 用 的 。

 

<第 七 章 、 深 入 Adapter>

本文地址:http://com.8s8s.com/it/it5761.htm