《如何在dnn创建类igoogle效果的模块》由会员分享,可在线阅读,更多相关《如何在dnn创建类igoogle效果的模块(4页珍藏版)》请在金锄头文库上搜索。
1、如何在DNN创建类IGoogle效果的模块上一篇 / 下一篇 2008-08-05 14:24:18 / 个人分类:Dotnetnuke 查看( 264 ) / 评论( 3 ) / 评分( 10 / 0 ) 如果你开发过DNN模 块,你应该知道DNN每个模块都存在一个模块设置,在此你可以设置某一模块实例的相关信息,比如:模块名称,模块权限,模块容器皮肤等等。而有时你如果想 扩展模块设置,增加自己的设置项,那你可以继承ModuleSettingsBase,该基类主要存在两个方法LoadSettings和 UpdateSettings:1. 2. LoadSettingsloadsthesetti
2、ngsfromtheDatabaseanddisplaysthem3. 4. PublicOverridesSubLoadSettings() 5. getthemodulesetting6. EndSub7. 8. 9. UpdateSettingssavesthemodifiedsettingstotheDatabase10. 11. PublicOverridesSubUpdateSettings() 12. Try13. DimobjModulesAsNewDotNetNuke.Entities.Modules.ModuleController 14. 15. UpdateModule
3、Settings16. objModules.UpdateModuleSetting(ModuleId,surveyclosingdate,DotNetNuke.Common.Globals.DateToString(datClosingDate)17. 18. CatchexcAsExceptionModulefailedtoload19. ProcessModuleLoadException(Me,exc) 20. EndTry21. EndSub我 想这对于DNN模块开发是比较方便,可是我偏偏对此极为抵触,觉得有时也许仅仅只有13个设置项,可每次都得跳转到模块设置页面里边,更新完毕又跳转
4、回 来,又得重新加载页面所有东西,值得么?不就更新几个值么?如此煞费心思,对比IGoogle的模块,都是Ajax方式更新,根本不需要每次都到后台设 置。静下来琢磨一下,其实在DNN似乎也可以做到,只要借助一下UpdatePanel,而DNN核心API已对UpdatePanel封装起来,只要合 理利用即可,该封装类为DotNetNuke.Framework.AJAX,下边不妨看看如何在DNN实现类IGoogle模块的效果:1)在Page_Init事件里封装UpdatePanel,pnlLatest为目标容器,该容器里的即为你需要Ajax更新的数据列表等。1. PrivateSubWrapUpda
5、tePanel() 2. IfAJAX.IsInstalledThen3. AJAX.RegisterScriptManager() 4. AJAX.WrapUpdatePanelControl(pnlLatest,False) 5. EndIf6. EndSub2)页面脚本处理,其中需要注意的是onInvoke和onComplete这两个函数,onInvoke负责提交数据到服务器,而onComplete将在数据返回客户端,完成更新后激发。1. 2. varModule_Container; 3. functioninitContainerID() 4. if(typeof(Module_Co
6、ntainer)=undefined)Module_Container=dnn.getVar(Container_ID); 5. 6. 7. Sys.Net.WebRequestManager.add_invokingRequest(onInvoke); 8. Sys.Net.WebRequestManager.add_completedRequest(onComplete); 9. 10. functiononInvoke(sender,args) 11. initContainerID(); 12. $get(Module_Container+lstContent).style.displ
7、ay=none; 13. $get(updateProgress).style.display=; 14. 15. 16. functiononComplete(sender,args) 17. initContainerID(); 18. $get(Module_Container+lstContent).style.display=none; 19. $get(updateProgress).style.display=none; 20. 21. 22. 23. 24. 25. 26. Onupdatingtheentrieslist,plaesewaitingfor. 27. 3)更新模
8、块设置:1. PrivateSubbtnUpdate_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesbtnUpdate.Click 2. RecentEntriesMax=Convert.ToInt32(ddlEntriesMax.SelectedValue) 3. DimobjModulesAsNewModuleController 4. objModules.UpdateModuleSetting(ModuleId,LatestEntriesMax,RecentEntriesMax) 5. objModules.Upda
9、teModuleSetting(ModuleId,ContentLength,txtLengthMax.Text) 6. 7. ReBindthedatalist8. BindEntriesList() 9. EndSub解 析:从这可看出,最终还得需要UpdateModuleSetting来实现我们的功能,只不过是借助了Ajax来更新吧。也就是当点击按钮 btnUpdate提交数据时将会触发onInvoke脚本实现了Ajax方式的更新(原因就是更新操作已被封装在UpdatePanel),在此我们没 有详细讲述Sys.Net.WebRequestManager的原理机制:1. Sys.Net.
10、WebRequestManager.add_invokingRequest(onInvoke); 2. Sys.Net.WebRequestManager.add_completedRequest(onComplete);如果有兴趣可以看看官方文档。4)以上更新过程还得需要一辅助脚本dnn.js,故切记在Page_Load里添加该命名空间的注册:1. ClientAPI.RegisterClientVariable(Me.Page,Container_ID,Me.ClientID+_,True) 2. Requiresatabareminimumthednnnamespace,3. sowen
11、eedtoregisteritregardlessofwhetertheClientAPIisdisabledornot4. ClientAPI.RegisterClientReference(Me.Page,ClientAPI.ClientNamespaceReferences.dnn)进阶应用:其实你还可以控制设置项何时出现,比如一般在编辑状态才出现,否则自动隐藏。这一功能可用不同方法实现,在此我还是发扬“物进所用”精神,借助DNN的Personalization机制来控制控制设置项的呈现。1. DimModeAsString=CType(DotNetNuke.Services.Perso
12、nalization.Personalization.GetProfile(Usability,UserMode&Me.PortalSettings.PortalId.ToString),String) 2. TODO(duetotheHard-Codesnippet)3. IfMode=EditThen4. Showthesettingcontrols5. tblSettings.Visible=True6. btnUpdate.Visible=True7. EndIf关于Personalization服务,这是一个DNN极其有用的核心机制,也许以后文章会有所涉及,先不妨看看下边链接,相信你会有所收获:Lets Talk DotNetNuke User PersonalizationModule Settings and Personalization: Easily Store Data For Your DotNetNuke?