ArcGIS Server 9.3 中AJAX支持两种实现方式
来源:互联网 发布:淘宝货到付款拒收 编辑:程序博客网 时间:2024/05/22 15:53
http://blog.sina.com.cn/s/blog_604e62df0100ek28.html
ArcGIS Server 9.3中AJAX支持两种实现方式:Callback机制和PartialPostback 机制。
Callback机制
1、Callback机制的实现过程
(1)在客户端的控件一般是html控件、Toolbar上的按钮或者一些超链接(asp.net的控件不行)。在客户端的实现代码一般如下:
<scriptlanguage="javascript"type="text/javascript">
function btnStreet1_onclick() {
//获取控件的值
var v=document.getElementByIdx("selStreet").value;
//生成请求字符串
varmessage="ControlID=Map1&ControlType=Map&Type=queryS&EventArg="+ v;
var context = "Map";
// sCallBack 由服务端的Page_load事件中生成的,用于请求服务端的js代码
<%=sCallBack%>
}
</script>
然后在控件的click事件或者其他对应的方法中调用上述js方法。
例如:在html按钮的属性中:onclick="returnbtnStreet1_onclick()"
Toolbar上的按钮:ClientAction="SetMapView()"
// SetMapView()类同于上述js方法
超链接:<a href="#"class="padingClass"onclick="LocByInterestPoint('lctInterestPoint.aspx');">按兴趣点定位</a>
//LocByInterestPoint('lctInterestPoint.aspx')类同于上述js方法
(2)在服务器端(后台)的代码一般如下:
//注意首先要继承ICallbackEventHandler接口
public partial class _Default:System.Web.UI.Page,ICallbackEventHandler
{
public string sCallBack =string.Empty;
protected void Page_Load(object sender,EventArgs e)
{
sCallBack =Page.ClientScript.GetCallbackEventReference(this, "message","processCallbackResult", "context", "postBackError",true);
}
}
然后就是重载ICallbackEventHandler接口的两个成员函数了,
#region ICallbackEventHandler成员
//负责把结果回传给客户端
public string GetCallbackResult()
{
return smapstring;
}
//负责接收客户端javascript传来的参数,并对客户端的请求进行处理
public void RaiseCallbackEvent(string eventArgument)
{
try
{
if (eventArgument.Contains("SetMapView"))
ZoomToZBExtent();//自定义显示范围的实现函数
else if(eventArgument.Contains("DMLocation"))
LocationByIntePoint();//按兴趣点定位的实现函数
}
catch (Exception Err)
{
string s = Err.Message;
}
}
#endregion
private void ZoomToZBExtent()
{
if (Session["curMapExtentStr"] == null) return;
string sZBStr = Session["curMapExtentStr"].ToString();
if (sZBStr.Trim() == string.Empty) return;
string[] sZB = sZBStr.Split('/');
double dXMin = double.Parse(sZB[1]);
double dYMin = double.Parse(sZB[0]);
double dXMax = double.Parse(sZB[3]);
double dYMax = double.Parse(sZB[2]);
ESRI.ArcGIS.ADF.Web.Geometry.Envelope pEnve = newESRI.ArcGIS.ADF.Web.Geometry.Envelope(dXMin, dYMin, dXMax,dYMax);
Map1.Extent = pEnve;
Map1.CallbackResults.CopyFrom(Toolbar1.CallbackResults);
smapstring = Map1.CallbackResults.ToString();
}
另外RaiseCallbackEvent的其他实现方式有:
public string RaiseCallbackEvent(stringeventArgument)
{
NamueCollection keyValColl =CallbackUtility.ParseStringIntoNamueCollection(eventArgument);
if (keyValColl["EventArg"].ToString() =="MapIdentify")
{
…………. //功能实现代码
returnMap1.CallbackResults.ToString();
} }
else if (keyValColl["Type"].ToString() =="clear")
{
…………. //功能实现代码
returnMap1.CallbackResults.ToString();
}
}
2、一些重要的代码
(1)将其他控件在服务器端处理的结果返回客户端
Toc1.Refresh();
Map1.CallbackResults.CopyFrom(Toc1.CallbackResults);
(2)添加CallbackResult
String javascriptString ="alert('Hello');";
CallbackResultcustomCallbackResult=
CallbackResult.CreateJavaScript(javascriptString);
Map1.CallbackResults.Add(customCallbackResult);
或者
string value =key.Value.ToString();
CallbackResult callbackResult = newCallbackResult("div",
"Label" + key.Key.ToString(), "innercontent", value);
Map1.CallbackResults.Add(callbackResult);
(3)生成CallbackResult
无参数:CallbackResult callbackResult=newCallbackResult();
三个参数:
CallbackResult callbackResult=newCallbackResult(Control control,string eventarg,paramsobject[]parameters);
例如:
object[] oa = new object[1];
oa[0] = "MyMapTip.style.display='none';";
CallbackResult rst = new CallbackResult(pMap.Page, "javascript",oa);
pMap.CallbackResults.Add(rst);
四个参数:
CallbackResult callbackResult=newCallbackResult(string controlType,string controlID,stringeventarg,params object[]parameters);
例如:
string value =key.Value.ToString();
CallbackResult callbackResult = newCallbackResult("div",
"Label" + key.Key.ToString(), "innercontent", value);
Map1.CallbackResults.Add(callbackResult);
其他的例子;
1. 刷新ADF自身的控件TOC:
ESRI.ArcGIS.ADF.Web.UI.WebControls.Toctoc1 =(ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc)map.Page.FindControl("Toc1");
//toc变化代码
toc1.Refresh();
string myTocString= toc1.CallbackResults.ToString();
CallbackResult myTocCallBackString = new CallbackResult("TOC","Toc1", "content", myTocString);
map.CallbackResults.Add(myTocCallBackString);
2. 刷新asp.net控件
ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc
toc1 =(ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc)map.Page.FindControl("Toc1");
toc1.Nodes.Clear();
toc1.Refresh();
string aaa = toc1.CallbackResults.ToString();
CallbackResult tocstring = new CallbackResult("TOC", "Toc1","content", aaa);
map.CallbackResults.Add(tocstring);
==============================================================
PartialPostback方法
实现方法一:
要实现PartialPostback,首先要在页面上添加一个ScriptManager控件(页面中的第一个控件)
(1)在客户端的控件一般是asp.net控件(html服务器控件也行)。客户端一般不需要写js代码。
(2)在服务器端(后台)的实现过程如下:
首先将控件注册为异步postback 控件:
protected void Page_Load(object sender,System.EventArgs eventArgs)
{
ScriptManager1.RegisterAsyncPostBackControl(Button1);
}
//下面这段也是进行一些注册和初始化的工作,也是必要的
protected void Page_PreRender(objectsender, System.EventArgs eventArgs)
{
string scriptKeyCustom = "customDataItemScript";
if(!this.Page.ClientScript.IsClientScriptBlockRegistered(GetType(),scriptKeyCustom) &&!ScriptManager1.IsInAsyncPostBack)
{
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);";
scriptBlock = string.Format(scriptBlock, Page.ClientID);
this.Page.ClientScript.RegisterStartupScript(GetType(),scriptKeyCustom, scriptBlock, true);
}
}
然后就是具体功能的实现代码了,如下:
protected void Button1_Click(objectsender, System.EventArgs eventArgs)
{
double xCenter = double.Parse(TextBoxX.Text);
double yCenter = double.Parse(TextBoxY.Text);
double adfMapWidthEighth = Map1.Extent.Width / 8;
ESRI.ArcGIS.ADF.Web.Geometry.Envelope adfNewExtentEnvelope=
new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(xCenter -adfMapWidthEighth, yCenter - adfMapWidthEighth, xCenter +adfMapWidthEighth, yCenter + adfMapWidthEighth);
Map1.Extent = adfNewExtentEnvelope;
ScriptManager1.RegisterDataItem(Page,Map1.CallbackResults.ToString(),false);
//这句话至观重要,并需的。将结果返回客户端
}
实现方法二:
除了在页面添加ScriptManager控件外,还要添加UpdatePanel控件。
1)在客户端的控件一般是asp.net控件(html服务器控件也行)。客户端一般不需要写js代码。
(2)在服务器端(后台)的实现过程如下:
首先将控件注册为异步postback 控件:
protected void Page_Load(object sender,System.EventArgs eventArgs)
{
ScriptManager1.RegisterAsyncPostBackControl(Button1);
}
然后就是直接写功能实现函数,如下:
protected void Button1_Click(objectsender, System.EventArgs eventArgs)
{
double xCenter = double.Parse(TextBoxX.Text);
double yCenter = double.Parse(TextBoxY.Text);
double adfMapWidthEighth = Map1.Extent.Width / 8;
ESRI.ArcGIS.ADF.Web.Geometry.Envelope adfNewExtentEnvelope=
new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(xCenter -adfMapWidthEighth,
yCenter - adfMapWidthEighth, xCenter + adfMapWidthEighth, yCenter +adfMapWidthEighth);
Map1.Extent = adfNewExtentEnvelope;
string jsProcessCallbackResult =string.Format("ESRI.ADF.System.processCallbackResult('{0}');",
Map1.CallbackResults.ToString().Replace("//", "////"));
System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page,sender.GetType(), "changeextent", jsProcessCallbackResult,true);
//以上这两句话非常重要,将结果返回给客户端
}
- ArcGIS Server 9.3 中AJAX支持两种实现方式
- ArcGIS Server 9.3 中AJAX支持两种实现方式:Callback机制和PartialPostback 机制。
- Ajax的两种实现方式
- .NET实现ajax调用的两种方式
- Ajax+PHP实现跨域访问的两种方式
- jquery的ajax实现jsonp的两种方式
- 原生JavaScript和JQuery两种方式实现AJAX
- asp.net中使用ajax的两种方式
- Ajax中对于与禁止缓存的两种方式
- js中ajax请求的两种方式
- ajax 的两种方式
- DataTable 两种ajax方式
- ajax两种书写方式
- MS SQL Server 两种方式 实现事务
- Web-Server 中 PHP 的两种工作方式
- ArcGIS Server 中的 Ajax技术的实现(举例说明)
- ArcGIS教程:空间数据中时间的支持方式
- 新版本ArcGIS Server计划:不再支持32位系统,不再支持ADF开发方式
- Struts2 MVC
- PHP中exec、system等函数调用linux命令问题
- dumpbin的使用
- 共享权限与安全权限的区别
- Struts1和Struts2的区别和对比
- ArcGIS Server 9.3 中AJAX支持两种实现方式
- 目前最全的常用SQL语句示例(急用速查)!
- 金融信息传输8583协议
- eclipse无法检测加载插件可以偿试的方法
- LINUX设备驱动之设备模型一--kobject
- MySQL system tables...ERROR: 1062
- javascript性能优化
- LINUX设备驱动之设备模型二--kset
- boost库的编译命令