• 2007-09-29

    DNN中实现AJAX(类似ASP.NET的AJAX) - []

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://suamt.blogbus.com/logs/10084115.html

    详细信息可以参看《DotNetNuke Client API Client Callback》这篇文档,在DotNetNuke官方网站可以下载到的。所以这里不讨论为何做,只讨论如何做。并且这里的做法也跟《DotNetNuke Client API Client Callback》提的略有不同:
    1、类中实现接口:
    比如:partial class ViewDcampus_Declare : PortalModuleBase, IActionable, IClientAPICallbackEventHandler,这里的IClientAPICallbackEventHandler就是DNN为实现AJAX功能需要实现的接口,这里把它考过去就可以了。
    2、引入相关的js文件:
                    if (ClientAPI.BrowserSupportsFunctionality(ClientAPI.ClientFunctionality.DHTML) && ClientAPI.BrowserSupportsFunctionality(ClientAPI.ClientFunctionality.XMLHTTP) && ClientAPI.BrowserSupportsFunctionality(ClientAPI.ClientFunctionality.XML))
                    {                       
                            //ClientAPI.RegisterClientReference(this.Page, ClientAPI.ClientNamespaceReferences.dnn);
                            ClientAPI.RegisterClientReference(this.Page, ClientAPI.ClientNamespaceReferences.dnn_xml);//这个
                            ClientAPI.RegisterClientReference(this.Page, ClientAPI.ClientNamespaceReferences.dnn_xmlhttp);//还有这个是必须的
                    }
    这个东东,考到Page_Load段里面去就可以了。
    3、写Javascript代码:
    书写JS代码,怎么写,写到哪里去呢?先说怎么写:dnn.xmlhttp.doCallBack(sControlId, sArg, pSuccessFunc, sContext, pFailureFunc, pStatusFunc, bAsync, sPostChildrenId, iType);这样一句就足够了,只要跑到这段代码后,它就触发了回发,就是所说的异步刷新。里面的参数我付在这点的后面,这里先讨论写在哪里的问题。很明显,这个代码是依赖dnn_xml或者dnn_xmlhttp文件的,如果你把doCallBack写在一个JS文件里,那该怎么包含进来呢?答案是也像上面第2点一样注册你的JS文件,像这样:ClientAPI.RegisterClientScriptBlock(this.Page, "custom.js", " ");并且放在上面注册段的最下面就OK了。你直接写在页面上也可以,不过要确保在dnn_xml或者dnn_xmlhttp文件下面。不管怎么写,都要触发它,就像写在按钮的onclick = "dnn.xmlhttp.doCallBack('ViewDcampus_Declare','preview',this._previewSuccess,this,this._errorFunc,null,null,null,0);"一样,你把它包含在别的函数里也行。
    doCallBack参数:
    //sControlId:服务器控件的ID,用GetCallbackEventReference来生成这个方法时它会自动帮你写,但是也可以自己写。
    //sArg:触发函数要传数据给成功函数时,可以使用这个参数来传递,但是它会走进服务器端,所以服务器端可以截获这个参数并一步控制,如果不更改就简单传回去就可以了。它其实是post字符串的参数来的。
    //pSuccessFunc:回调成功后将运行的函数指针。成功函数和失败函数的三个参数第一个是服务器端回传回来的字符串参数,第二个是下面的sContext,剩下的第三个是XmlHttpRequest对象。
    //sContext:上下文,就是说,如果有几个按钮触发同一个docallback函数,那么可以简单传递this表示是哪个按钮按的,这个参数在服务器端不使用。
    //pFailureFunc:失败后的处理函数的指针
    //pStatusFunc:可能是状态改变函数,状态改变就触发的函数
    //bAsync:是否使用异步,false是同步方式(可能永远不会用到)
    //sPostChildrenId:需要传递该Form元素,把它当成是传递给服务器的参数一部分的话,就用这个参数,传入字符串形式的ID
    //iType:跟上面的参数一样,也会以参数的形式发给服务器端
    成功函数和失败函数示例:
        //成功函数
        _previewSuccess : function(result, ctx, _XMLRequestObj){
     alert();
        }
        //传回失败函数,所有回掉都用这个
        _errorFunc : function(result, ctx){
            alert(result);
        },

    4、实现接口的方法:
    这里回到实现了IClientAPICallbackEventHandler接口的后台类里面,需要实现接口函数
            string IClientAPICallbackEventHandler.RaiseClientAPICallbackEvent(string eventArgument) {
                switch (eventArgument) {
                    case "preview":
                        string _returnValue = "";
                        //这里写代码处理_returnValue
                        return _returnValue;
                        break;
                }
                //上面什么都不是就返回空值
                return "";
            }
    这里的eventArgument是通过post形式(如&aaa=bbb)发过来的,如上面的"preview",就是刚才在doCallBack里面的第2个参数。这里有个技巧就是,根据这个参数,运行不同的后台逻辑。

    写到这里DotNetNuke的Ajax基本上就可以了,就是这么简单^_^。这里比DNN的文档中的介绍少了个GetCallbackEventReference函数的调用,因为这个函数就是用来写docallback函数的,减少了灵活性,所以我把它提取出来写在JS里。


    历史上的今天:


    收藏到:Del.icio.us




    评论

  • 兄弟们不好意思,因为工作的原因已经不研究DNN了。DNN是个超级好东东,希望你们能在这条路上走地更远更好。谢谢大家
  • 我的Email是cxundead@yahoo.com.cn
  • 您好。。这篇文章有附带的例子么。。可以给我Email一份么。。对于dnn.xmlhttp.doCallBack我不是太理解
  • 我也是DNN学习者,希望和你联系。我的Email是nicholas.lu.mail(at)gmail.com。我的博客http://m2land.cnblogs.com