程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 基於DotNetNuke的動態窗體支持(一)

基於DotNetNuke的動態窗體支持(一)

編輯:關於ASP.NET

我在使用了DotNetNuke之後,對其中的UserDefinedTable模塊比較感興趣,並且認真的研究了 UserDefinedTable的數據結構和代碼,認為這個模塊的開發模式非常不錯,於是,就基於這個模塊,做了一些擴展的工作;和兩年前基於 Joolma的一個FacileForms所做的工作有點類似,就是希望以列表式、靈活展示的方式,讓用戶可以去定義自己的數據結構,無論是列表、展示還是查詢,都希望相對比較方便一些。其實,類似的模塊,在DotNetNuke、Drupal、Joomla裡面都有相若的例子,可見,對於CMS來說,這樣的需求,是較為普遍的,一個更為“開放”的模塊,對於用戶來說,其實更容易接受和擴展。

這裡我所講的東西,其實和DotNetNuke關系好像並不是太大,其實,都是ASP.Net的東西。

對比一下UDT、FacileForms等模塊,其實已經是相當不錯了:支持較為豐富的數據類型、數據結構設計也非常合理,存儲和查詢做的也非常好——其實我現在對UDT的理解還是在3.3.7基礎上的,後面升級了很多,但是都沒有時間詳細的去看。

不過,有一個問題就是,我覺得我們在日常生活中所使用的Forms,“零碎”更多,比如說,要增加什麼顏色的 Title、什麼Banner、什麼字體等等,所以,我覺得UserDefinedTable本來已經做得很好了,但是在這些“零碎”上,基本上卻沒有什麼擴展性,於是,在我開發的Form裡面,我希望界面的定義可以更加靈活一些,比如說,完全由用戶自己定義界面,美工使用DreamWeaver等工具去定義就可以了,而不需要和程序人員去溝通;只要在設計完成界面之後,在特定的地方,插入一些標識符(TAG),然後,模塊就可以對這些標識符進行解析,並且插入相應的控件。如果可以這樣做的話,我們就將所有的界面工作可以完全的丟給美工,讓美工去處理就好了。

至於UDT和Joomla的FacileForms為什麼沒有這麼做,我還不太理解;下面,我來說一下我這樣做的思路。

1、ASP.Net已經支持動態加載用戶控件,用戶控件基本上是一個ascx的文件,對於美工來說,這個可以是一個html文件,只要在設計完成之後,修改一下擴展名就可以了。所以,對於Form來說,每一個動態的Form,對應一個唯一的ascx文件;

2、ASP.Net在加載完成ascx文件之後,可以讀取ascx文件中的server標記,這就為加載完成之後,立即對服務器控件進行解析提供了方法,舉一個例子,我們用下面的方法加載一個ascx控件:

Dim uc AS Control
Dim strFormatFileName = "/Portals/0/RedstartForm/371_1.ascx"
uc = CType(Page.LoadControl(strFormatFileName), Control)

上面的代碼,我們已經用ASP.Net在運行時動態加載了一個用戶控件,這個用戶控件,可以由我們的美工人員進行定義(當然,在實際的代碼中,strFormatFileName是動態產生的,可以根據當前的模塊ID等進行動態綁定),當我們加載完了用戶控件之後,馬上用代碼去遍歷用戶控件,找到我們定義的標識符,然後,再進行處理。代碼如下:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved