Register  |  
About the author
Baldwin's Status
 Contact Me
Baldwin Sun
Senior Developer for dnn solution & founder of SunBlog module...
Blog搜索
相册库
更多照片请查看相册库
最新评论
Rss Feed
feedsky
抓虾
pageflakes
newsgator
哪吒
我们的服务
  • DotNetNuke 咨询
  • Web设计及其模块开发
  • 免费建站
  • 电子商务
  • 开拓市场
我们致力于开发定制的web 2.0 ,所服务的客户主要包括小中型企业,社区俱乐部及其非盈利机构组织。我们将利用开源的DNN作为我们核心的系统机制,更多相关信息...

DNN模块开发应用Ajax之Utility

Posted in [DNN使用及思考], [DNN模块开发], [杂项] By baldwin

在此列举一些在开发Ajax模块中的技巧及其相关Utility方法.
1)  检测并注册Ajax
Utility
 Private Sub RegisterDNNAjax()
      ' Determine if AJAX is installed
      If DotNetNuke.Framework.AJAX.IsInstalled Then
            AJAX.RegisterScriptManager()
          ' Create a reference to the Script Manager
          Dim objScriptManager As ScriptManager = ScriptManager.GetCurrent(Page)
            objScriptManager.Services.Add(New ServiceReference(Me.ModulePath "CommentService.asmx"))
            objScriptManager.Scripts.Add(New ScriptReference(Me.ModulePath "js/dnnsunBlog.js"))
     End If
 End Sub
2) dnn.js的加载问题,作为dnn核心的ClientAPI,大名鼎鼎,我想大家都知道,它主要负责客户端脚本和服务器端的交互通讯,其中包括隐藏变量的注册,服务器控件的客户端事件的激发等等。DNN默认的Webcontrols就是充分利用ClientAPI来实现的,包括dnnMenu, dnnTree等等,页面的拖拽功能也是如此。在此我倒不是详细讨论ClientAPI的功能和用法,只是稍微提一下在开发过程需要注意的一点,那就是dnn.js脚本的加载,该脚本是有条件加载的,也就是说你不能假定你任何时候都可以使用dnn.js文件里定义的方法, 比如最常见的dnn.getVar方法。一般注册用户登录时页面并没有加载dnn.js默认只是加载了dnncore.js,你不妨做个试验,那就是用某一注册用户登录dnn,并察看页面源代码,你会发现是不存在dnn.js脚本文件的。例如, 如果你的容器皮肤文件是使用dnnMenu的话,那么dnnMenu控件会要求dnn.js的加载,当然因为dnnMenu只有在admin/host用户登陆时才呈现,所以dnn.js也只有在这种情况下才会被注册.这就是我刚才提到的问题所在.那么解决方案就是我们只能在开发过程假设必须使用到dnn.js的话,就得手动地注册它。比如在Page_Load事件里添加:
注册dnn.js(也就是注册dnn命名空间)
 'Requires at a bare minimum the dnn namespace, so regardless of wheter the ClientAPI is disabled of not we
 'need to register it.
 ClientAPI.RegisterClientReference(Me.Page, ClientAPI.ClientNamespaceReferences.dnn)
接下来,你就可以畅通无阻的使用dnn.js了,比如你可能最常见可能是注册某个隐藏变量,然后在客户端从脚本获取:
服务器注册变量
ClientAPI.RegisterClientVariable(Me.Page, "Container_ID", cmdAddComment.NamingContainer.ClientID "_", True)
客户端获取变量
var Module_Container;
function initContainerID()
{
  if ( typeof(Module_Container) === 'undefined')   Module_Container = dnn.getVar('Container_ID');
}
比如最近项目我是如此利用这些功能的,在此提供一个例子:
模态显示更新进度信息
Sys.Net.WebRequestManager.add_invokingRequest(onInvoke);
Sys.Net.WebRequestManager.add_completedRequest(onComplete);
 
function onInvoke(sender, args)
{
    initContainerID();
    $find( Module_Container 'mpeProgress').show();
}
 
function onComplete(sender, args)
{
    initContainerID();
    $find( Module_Container 'mpeProgress').hide();
}
 
function pageUnload()
{
    Sys.Net.WebRequestManager.remove_invokingRequest(onInvoke);
    Sys.Net.WebRequestManager.remove_completedRequest(onComplete);
}

Comments

Was it good for you, too?Join the discussion » ,but you need to login first before you make comments.