easyui treegrid 调webservice实现异步加载

效果:(不放个图下次看到这个记录时总觉着没印象,呵呵)

easyui treegrid 调webservice实现异步加载

首先加载一级节点,单击展开时加载所有子节点。

实现方式:

easyui treegrid+webservice 后台方法,使用json格式数据交互

前台代码:

  //初始化测点树表格

        function InitTreeGrid() {

            $('#tag_treegrid').treegrid({

                width: 300, height: 350, nowrap: false, rownumbers: true, animate: true, collapsible: true,

                idField: 'id', treeField: 'text', parentField: 'pid', fit: true, fitColumns: true, border: false, showHeader: false,

                url: "CurveDataService.asmx/getTagTreeJSON?parentId=0", //调用webservice时使用url传参

                method:'GET',

                //queryParams: { ip: '', portStr: '', parentId: '0' },

                //第一次加载时可以使用queryParams传递额外参数,但在onBeforeExpand事件里加载时却没有额外参数回传,默认只回传id=**这个参数。

                //但id又不是webmethod的参数名字所以抛出了调用异常,最后改用Get方式提交请求,用url传参。

                onBeforeExpand: function (node) {

                    $('#tag_treegrid').treegrid('options').url = "CurveDataService.asmx/getTagTreeJSON?parentId=" + node.id;

                }

});}

后台代码:

        [WebMethod(Description = "获取测点树")]

        public void getTagTreeJSON(string parentId)

        {

            try

            {

                List<EasyUI_treenode> nodeTree = new List<EasyUI_treenode>();

                if (parentId == "0") //加载区域

                {

                    List<CurveConfig.AreaInfo> allAreaList = CurveService.Instance.getAllAreaInfo();

                    foreach (var area in allAreaList)

                    {

                        nodeTree.Add(new EasyUI_treenode() { id = "Area_" + area.name, text = area.desc, state = "closed" });

                    }



                }



                Context.Response.Write(JsonConvert.SerializeObject(nodeTree));

            }

            catch (Exception ex)

            {

                LogHelper.Instance.LogError("getAllAreaJSON execute error!", ex);

                Context.Response.Write(JsonConvert.SerializeObject(new List<CurveConfig.AreaInfo>()));

            }

        }

实现是遇到几个问题:
1.webservice 返回值

使用 public string MethodName(string para){ return "result"}方式返回的数据会使用xml格式包起来,所以treegrid控件不能识别数据格式,加载数据失败。

改成使用 context.Response.Write() 方法数据问题解决

2.onBeforeExpand 事件里面不能回传额外参数

在IE9的调试请求正文里只看到id=‘sss’ 这么一个参数,并且id不是webmethod方法的参数名字,所以抛出了请求异常。

改用url传参解决这个问题。  url: "CurveDataService.asmx/getTagTreeJSON?parentId=0", //调用webservice时使用url传参

注意需要在web.config里配置一下让webservice支持get请求

  <webServices>

      <protocols>

        <add name="HttpPost" />

        <add name="HttpGet" />

      </protocols>

    </webServices>

改完这些请求还是没有数据的,因为treegrid默认是使用的post请求方式,所以要在前台添加 method:‘GET’属性。

 ==========================================================================

2013-02-21 更新:

上面webservice 返回值的问题改成Response.write方式后出现了新的问题,同事用Flex调用接收不到这个输出,所以必须改成return方式

  $.ajax({

                type: "POST",

                 dataType:'text',

                url: "FcDatraService.asmx/setDefaultArea",

                data: { areaList: checkQuYuStr },

                success: function (result) {

                    alert($(result)[2].textContent);

                }

            });

改成return方式后,$.ajax在默认情况下回自适应返回值类型,所以在IE下可以使用result.text获取到返回值就是xml格式中间的内容;但火狐和goole下面就不行了,result是个document对象,没有text属性。

所以最后指定为text,这样在各个浏览器下面都是那一段xml的文本,使用jquery对象获取第二个元素的textContent内容就行了。

 

 

 

 

你可能感兴趣的:(webservice)