在使用 DotNetNuke 過程中,我對其 UserDefinedTable (UDT) 模組深感興趣,並深入研究其資料結構與程式碼。UDT 的開發模式極具參考價值,雖然它已支援豐富的資料類型、合理的結構設計與查詢機制,但在「零碎的介面客製化需求」(如標題顏色、Banner、字體調整等)上擴展性不足。
為了解決此問題,我設計了一套完全由使用者定義介面的動態表單機制:美工以 Dreamweaver 設計完整 HTML 頁面,僅在需動態互動處插入特定標記(Tag),模組再解析標記並注入對應伺服器控件。這樣即可將介面工作徹底交給美工,無需程式人員介入。
ASP.NET 原生支援執行期動態載入用戶控件 (.ascx)。對美工而言,.ascx 可視為 HTML 檔,設計完成後更改副檔名即可。每個動態表單對應一個唯一的 .ascx 檔案。
載入完成後,透過遞迴遍歷控件集合,尋找預留的 PlaceHolder(ID 以 __ 開頭),並根據欄位定義動態建立並加入對應控件:
Dim uc As Control
Dim strFormatFileName = "/Portals/0/RedstartForm/371_1.ascx"
uc = CType(Page.LoadControl(strFormatFileName), Control)
For Each c As Control In uc.Controls
If c.GetType.ToString().Equals("System.Web.UI.WebControls.PlaceHolder") Then
Dim strControlName As String = c.ID.Replace("__", "")
For Each objField As RedstartFormFieldInfo In colFields
If strControlName.ToUpper() = objField.FieldName.ToUpper() Then
objCtl = MyControls.Add(objField.FieldTitle, objField.FieldType, objField.KeyID, objField.FieldName, _
PublicFunction.FormatParameter(objField.DefaultValue, strRowID, strParentID, strRelateRowID), _
objField.Required, bEnabled, objField.IsReadOnly, PublicFunction.FormatParameter(objField.Extended, strRowID, strParentID, strRelateRowID), _
objField.CssEnable, objField.CssDisable)
c.Controls.Add(objCtl)
Exit For
End If
Next
End If
Next
此架構實現了「介面設計與業務邏輯解耦」,大幅提升開發效率與維護彈性。