ArcGIS Server 9.3 中 ASP.NET ajax(Partial Postback)方法

学习ArcGIS Server中自带的例子 Common_PartialPostback_CSharp 的思路过程:

1、务必添加<asp:ScriptManager>标签。
   ScriptManager的作用:是AJAX核心控件,用来处理页面上的所有组件以及页面局部更新,生成相关的客户端代理脚本以便能够在

JavaScript中访问Web Service,通过它引入Microsoft AJAX库脚本。

2、为了处理非ADF控件操作ADF控件以实现局部刷新,需要注册处理服务端CallbackResult的processCallbackResult函数。具体代码

如下:
   string scriptKeyCustom = "customDataItemScript";
   //判断是否注册过,是不是AsyncPostBack方式刷新页面。通过if条件的过滤基本上是在第一次加载页面份的时候发生下面注册
   if (!this.Page.ClientScript.IsClientScriptBlockRegistered(GetType(), scriptKeyCustom) &&
        !ScriptManager1.IsInAsyncPostBack)
        {
            //js代码块
            string scriptBlock = @"
                function onLoadFunction(){{
                  Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(AsyncResponseHandler);
                }}

                function AsyncResponseHandler(sender, args) {{
                  var dataItems = args.get_dataItems();
                  if (dataItems['{0}'] != null)
                    ESRI.ADF.System.processCallbackResult(dataItems['{0}']);
                }}

                Sys.Application.add_init(onLoadFunction);";
            //{0}
            scriptBlock = string.Format(scriptBlock, Page.ClientID);
            //将其注册到页面js上
            this.Page.ClientScript.RegisterStartupScript(GetType(), scriptKeyCustom, scriptBlock, true);
        }
    服务器端将CallbackResults(可以是控件的、也可以是自定义的)传到客户端之后,就交由上述的客户端Js函数

ESRI.ADF.System.processCallbackResult()来实现客户端内容的局部刷新。


3、如何将服务器端CallbackResults(以ADF控件Map的CallbackResults为例说明)传递给上述客户端注册的js中

processCallbackResult函数处理呢?
   以字符串Map1.CallbackResults.ToString()的形式发给客户端。
   并不是所有Map控件的刷新都需要明确的在服务器定义提交到客户端js的方法,这里的提交到客户端js的方法:

ScriptManager1.RegisterDataItem(Page, Map1.CallbackResults.ToString(), false); 因此分为两种情况:
   I、非ADF控件触发的Map1.CallbackResults内容发生改变的情况。
      此时需要主动的提交到客户端js去,例如非ADF控件触发的使map的范围发生变化,使用如下代码:
        Map1.Extent = adfNewExtentEnvelope;
        // Register the map's callback results as a dataItem so that they are processed on the client
        ScriptManager1.RegisterDataItem(Page, Map1.CallbackResults.ToString(), false);
  
   II、如果是ADF控件触发的Map1.CallbackResults内容发生改变的情况。
      只需要将Map1.CallbackResults内容发生改变就可以了。代码如下:

        //将需要AJAX的非ADF控件内容添加到ADF控件中的CallbackResults中。
        ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult updateLabelCallbackResult =
            ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult.CreateSetInnerContent(LabelN,

adfEnvelope.YMax.ToString("N"));
        Map1.CallbackResults.Add(updateLabelCallbackResult);

        updateLabelCallbackResult =
            ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult.CreateSetInnerContent(LabelE,

adfEnvelope.XMax.ToString("N"));
        Map1.CallbackResults.Add(updateLabelCallbackResult);
  
       str = str + "<a href='Details.aspx?dddd=" + idv + "'" + " target='_blank'>" + namev + "</a>" + "<br />";
       CallbackResult customCallbackResult = CallbackResult.CreateSetInnerContent("div", str);//"div"=control ID
       Map1.CallbackResults.Add(customCallbackResult);


4、ASP.NET ajax中哪些方法可以实现微软控件的局部刷新呢?
   I、最简单的方法:将Control放到<asp:UpdatePanel >标签内。基本上像使用非Ajax方式使用就可以实现局部刷新了。
   II、Data items方式:一般控件是在UpdatePanel标签外,基本的思路如下:
       a、在page_load中注册控件,如:
          ScriptManager1.RegisterAsyncPostBackControl(Text1);
          ScriptManager1.RegisterAsyncPostBackControl(Menu1);
       b、使用上面“2、”中注册processCallbackResult函数方法注册。
       c、控件内容添加到 Map1.CallbackResults中,如:
          Map1.CallbackResults.Add(***CallbackResult);
       d、最后ScriptManager注册,例如:
          ScriptManager1.RegisterDataItem(Page, Map1.CallbackResults.ToString(), false);
    III、Dynamic Script Blocks (略)

  

posted @ 2010-01-07 10:59  爱图--UpdooGIS  阅读(532)  评论(0编辑  收藏  举报