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 (略)