• easyui treegrid 调webservice实现异步加载


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

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

    实现方式:

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

    前台代码:

      //初始化测点树表格
            function InitTreeGrid() {
                $('#tag_treegrid').treegrid({
                     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内容就行了。

  • 相关阅读:
    lua学习之循环求一个数的阶乘
    lua元表学习
    ArrayList与List性能测试
    安卓开发线程
    安卓开发
    全局设置导航栏
    LinearLayout
    安卓布局ConstraintLayout
    安卓网络请求和图片加载
    安卓启动页面
  • 原文地址:https://www.cnblogs.com/zhaobl/p/2916985.html
Copyright © 2020-2023  润新知