executeTask('args=' + document.getElementById('TaskManager1_DefQuery1_sellayer').value + ':' + document.getElementById('TaskManager1_DefQuery1_textBox').value, "WebForm_DoCallback('TaskManager1$DefQuery1',argument,processCallbackResult,context,postBackError,true)");
里面包含两部分,一是传入的参数,一是WebForm_DoCallback,后者可以去看ASP.Net2.0异步调用相关资料。executeTask函数在display_task.js中,它完成两件事情,分配一个job id来跟踪异步请求,和初始化一个回调并触发TaskResults控件中的指示器(指示Task程序正在运行中)。 2.调用startJob函数 startJob提供了一系列的参数,通过键值对方式传送用户请求: EventArg=startTaskActivityIndicator&taskJobID=1&args=0:TYPE='St'
然后通过参数_callbackArg传入RaiseCallbackEvent方法。 3.服务器端处理 客户端的请求传入服务器端在GetCallbackResult方法中进行处理,这里分为两个步骤,一是startTaskActivityIndicator,它会在TaskResults控件中指示Task任务正在执行,二是executeTask,即处理真正的核心业务: public override string GetCallbackResult() { NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg); if (keyValColl["EventArg"] == "executeTask") { string sInArgs = keyValColl["args"]; string delim = ":"; char[] delchar = delim.ToCharArray(); string[] args = sInArgs.Split(delchar); object[] inputs = new object[2]; inputs[0] = args[0]; inputs[1] = args[1]; Input = inputs; } else if (keyValColl["EventArg"] == "startTaskActivityIndicator") { } else if (keyValColl["EventArg"] == "hidden") { } return base.GetCallbackResult(); }
参数为"executeTask"时,会执行ExecuteTask重写方法,里面可以处理业务逻辑,将结果保存为一种Results,可以是SimpleTaskResult、DataSet或TaskResultNode。 4.DisplayResults显示结果 Task处理完之后,最终会交给DisplayResults将结果显示出来,看看DisplayResults代码: protected virtual void DisplayResults( string jobID, object taskInput, object taskResults) { ITaskResultsContainer resultsContainer = null; for ( int i = 0; i < TaskResultsContainers.Count; i++) { resultsContainer = Utility.FindControl(TaskResultsContainers[i].Name, Page) as ITaskResultsContainer; if (resultsContainer != null) { resultsContainer.DisplayResults( this, jobID, taskInput, taskResults); CallbackResults.CopyFrom(resultsContainer.CallbackResults); } } }
5.processCallbackResult 最后所有回调的结果均返回到回调响应函数——processCallbackResult,它专门处理客户端Web ADF控件的回调响应,并触发一系列后续动作,更新客户端显示,这样整个Task就执行完成了。 Build整个工程,生成DefQuery的DLL文件,用模板新建一个ArcGIS Server应用,展开工具栏右键空白处,选择之前生成的dll,此时就可以像QueryAttributeTask等原有的Task一样来使用DefQuery了,添加到TaskManager中,发布整个Web应用,这样自定义的Task就完成了,可以看看效果,下图做了一个简单的查询Task,根据用户写的属性查询条件,在地图上返回所查询的地图。 Task查询之前 Task查询之后 进一步完善应用: 1.以上自定义Task的UI基于FloatingPanel,我们可以更改它的现实样式,比如透明度、颜色、布局等等。 2.可以将显示出来的结果存为一个Graphic图层,保留原始图层。 3.根据属性查空间信息,考虑查询到结果时,同时将Map定位到结果所在的窗口范围。