ArcGIS Server中从客户端往服务器端传参数的几种方法(转)

到现在我对asp.net还处于初学阶段,但这不太影响我利用ags的功能。因为同一种功能可以有多种方法去实现。
比如要在数据源中添加一个点,就需要在客户端完成动作后,将这个点的坐标传到服务器端,调用ao来完成工作。就我目前的认识,想到有一下几个办法来完成此工作:
1、自定义adf的工具。工具提供了很好客户端与服务器端交互的办法,实现IMapServerToolAction接口即可。具体请参考帮助或其他资料。但有时候,比如这次,我们并不想让用户点击屏幕后立即在此处生成数据。先用adf javascript绘制一个graphicfeature,用户可以对此位置进行修改。点击保存按钮后才真正在服务器端添加数据。这种情况下自定义工具就不行了;
2、ICallBackEventHandler,这是最基本(当然还有更基本的xmlhttprequest)方法。arcgis server 9.3中支持两种ajax的方式:asp.net ajax和callback。这个接口是后者实现的关键。该接口中的raisecallbackevent()方法可以用来接收客户端string类型的参数,可以满足此次需求。但写起来有些麻烦;
3、在客户端放置隐藏控件。这是我在网上搜索后找到的一种普遍的解决办法。在客户端放置一个隐藏的asp.net或者传统的http控件,通过js给其赋值,然后在postback时服务器就可以获得该控件的值。但我发现这样做必须进行postback,也就是对页面进行刷新,在callback机制(partial postback)下,服务器端无法获得想要的参数值。我猜想是因为不同于刷新页面,客户端并没有将页面中其他的值传到服务器上(如果有不对,请大家指正)。
4、利用adf的控件,CallbackButton。真冷无牙朋友之前发过帖子http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=25526。那时9.3的正式版本还没有出来。但现在这个控件已被收录到adf的标准控件中了(我不太确定是9.3 sp1中的还是9.3本身的)。该控件利用了adf的callbackresults框架,利用起来非常方便。可以查看源代码,发现其实还是对ICallBackEventHandler机制进行了封装。但用起来方便就行。该控件有一个CallbackArgumentsJavaScript参数,可以在客户端执行js,将变量值保存在控件中,服务器端利用CallbackArguments来获取客户端的参数值。比如一下代码:

  1.   
  2.     protected void CallbackButton1_Clicked(object sender, EventArgs args)
  3.     {
  4.         string text = CallbackButton1.CallbackArguments["txt"];
  5.         CallbackButton1.CallbackResults.Add(Label1, "innercontent", text);
  6.     }

  7.   <script runat="server">
  8.     protected void CallbackButton1_Clicked(object sender, EventArgs args)
  9.     {
  10.         string text = CallbackButton1.CallbackArguments["txt"];
  11.         CallbackButton1.CallbackResults.Add(Label1, "innercontent", text);
  12.     }
  13. </script>
  14. <html xmlns="http://www.w3.org/1999/xhtml" >
  15. <head runat="server">
  16.     <title>Callback Button sample</title>
  17. </head>
  18. <body>
  19.     <form id="form1" runat="server">
  20.     <div>
  21.         Enter some text: <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
  22.         <br />
  23.         <br />
  24.         <esri:CallbackButton ID="CallbackButton1" runat="server" OnClicked="CallbackButton1_Clicked"
  25.             Text="Click Me!" Width="139px" CallbackArgumentsJavaScript="'txt='+document.getElementById('TextBox1').value" />
  26.         <br />
  27.         <br />
  28.         Echo: <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
  29.     </div>
  30.     </form>
  31. </body>
  32. </html>
复制代码
具体可以参考帮助。但有一点要说明的是,CallbackArguments是利用了adf的ParseStringIntoNameValueCollection方法将值解析成NameValueCollection。而查看该方法的定义可以得知,如要传多个参数到服务器端,应当用“&”符号来连接。比如CallbackArgumentsJavaScript="'txt='+document.getElementById('TextBox1').value+‘&txt1='+document.getElementById('TextBox2').value"(帮助中也不说,esri论坛上也没有……)

至于其他方法,肯定还是有的,比如发送请求的方式(但这个我不会,烦请会的同志出来讲讲)等。
一起学习GIS及其二次开发,一起进步!
原文地址:https://www.cnblogs.com/tuncaysanli/p/1550960.html