解決在DNN模塊開發中新增頁面顯示時崩潰的問題

問題回顧

最近在研究一個DNN模塊,其中有一個彈出界面是直接從DotNetNuke.Framework.PageBase繼承來實現的。之前在DNN老版本上貌似是可以跑起來的,但是最近把它重新部署到DNN6和DNN7上時頁面卻崩潰了。以下是對應的錯誤信息:

StackTrace: 
Message: DotNetNuke.Services.Exceptions.ModuleLoadException: The control collection cannot be modified during DataBind, Init, Load, PreRender or Unload phases. ---> System.Web.HttpException: The control collection cannot be modified during DataBind, Init, Load, PreRender or Unload phases. at System.Web.UI.ControlCollection.Add(Control child) at DotNetNuke.UI.Utilities.ClientAPI.RegisterDNNVariableControl(Control objParent) at DotNetNuke.UI.Utilities.ClientAPI.get_ClientVariableControl(Page objPage) at DotNetNuke.UI.Utilities.ClientAPI.GetClientVariableList(Page objPage) at DotNetNuke.UI.Utilities.ClientAPI.RegisterClientVariable(Page objPage, String strVar, String strValue, Boolean blnOverwrite) at DotNetNuke.UI.Utilities.ClientAPI.RegisterClientReference(Page objPage, ClientNamespaceReferences eRef) at DotNetNuke.UI.Utilities.ClientAPI.RegisterClientReference(Page objPage, ClientNamespaceReferences eRef) at DotNetNuke.UI.Utilities.DNNClientAPI.EnableMinMax(Control objButton, Control objContent, Int32 intModuleId, Boolean blnDefaultMin, String strMinIconLoc, String strMaxIconLoc, MinMaxPersistanceType ePersistanceType, Int32 intAnimationFrames, String strPersonalizationNamingCtr, String strPersonalizationKey) in C:\DNN5Dev\Library\UI\Utilities\ClientAPI.vb:line 155 at DotNetNuke.UI.Utilities.DNNClientAPI.EnableMinMax(Control objButton, Control objContent, Int32 intModuleId, Boolean blnDefaultMin, String strMinIconLoc, String strMaxIconLoc, MinMaxPersistanceType ePersistanceType, Int32 intAnimationFrames) in C:\DNN5Dev\Library\UI\Utilities\ClientAPI.vb:line 149 at DotNetNuke.UI.Utilities.DNNClientAPI.EnableMinMax(Control objButton, Control objContent, Int32 intModuleId, Boolean blnDefaultMin, String strMinIconLoc, String strMaxIconLoc, MinMaxPersistanceType ePersistanceType) in C:\DNN5Dev\Library\UI\Utilities\ClientAPI.vb:line 141 at DotNetNuke.UI.Utilities.DNNClientAPI.EnableMinMax(Control objButton, Control objContent, Boolean blnDefaultMin, MinMaxPersistanceType ePersistanceType) in C:\DNN5Dev\Library\UI\Utilities\ClientAPI.vb:line 111 at DotNetNuke.UI.UserControls.LabelControl.Page_Load(Object sender, EventArgs e) in C:\DNN5Dev\Library\UI\UserControls\LabelControl.vb:line 243


 

在網上找了很多也簡單查找了DNN中的源碼,一直沒有找到原因。最近在瀏覽DNN官網的論壇時無意中有個老外提及了這個問題,幸運的是這次有個善良的老外回答了這個問題。以下是那個老外(William Severance)的回答:

The RegisterClientVariable method requires that the page's form contain a hidden input control with id and name of "__dnnVariable". Add the following markup to your aspx page's form and I think you'll have this working:

<input id="__dnnVariable" runat="server" name="__dnnVariable" type="hidden" />

No doubt you may find other similar problems when hosting dnn controls outside of a module container on the Default.aspx page.

由此可見,如果想在非default.aspx頁面中使用dnn的用戶控件,那你必須在你的頁面的form中增加一個id爲__dnnVariable的隱藏的input元素。按照這個方法,我在我的那個頁面中添加了上訴的隱藏input元素--結果界面顯示正常了。

 

更多的思考

即使自定義的頁面能夠正常顯示了,但是這些頁面並沒有把DNN一系列的CSS文件以及jQuery引入進來。由此這些界面的樣式看上去特別彆扭,那是不是還有改進的餘地呢?

 

其實在遇到這個錯誤的時候,其實我想到了另外一個解決方案,下面是我的想法:

1、將頁面中的內容封裝進一個ascx用戶控件中

2、在原有調用彈出頁面的地方使用DNN原始支持的dnnModal.show來用彈出式div的方式顯示ascx控件

3、將此控件定義爲模塊組件,重新build生成模塊安裝包

4、卸載原模塊並重新安裝該模塊

由於時間原因該方式還沒有試過,有興趣的童鞋可以先試試 :)

 

參考:

http://www.dnnsoftware.com/forums/forumid/118/threadid/330351/scope/posts/threadpage/2

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章