ztree吧 关注:1,833贴子:12,479
  • 9回复贴,共1

树的菜单项超过19或21项后,无法激活ajax url

只看楼主收藏回复

在ASP.NET MVC4中,通过拖拉生成树型菜单,在树型菜单项数量小于19或21项时,以下代码可以正确执行,当树型菜单项数量大于19或21项时,不去执行 url: "/Courseware/SummitCourseResources?id=" + *@ViewData["id"]*后台代码,请教一下,这是什么个情况?
var nodes = zTreeObj.transformToArray(zTreeObj.getNodes());
$.ajax({
url: "/Courseware/SummitCourseResources?id=" + *@ViewData["id"]*,
contentType: "application/json",
type: "post",
data: JSON.stringify(nodes),
dataType: "json",
async: true,
cache: false
});


IP属地:云南1楼2014-09-02 10:55回复
    虽然没人回复,但问题已经解决,附上解决办法,希望有人能用到:
    var nodes = zTreeObj.transformToArray(zTreeObj.getNodes());
    JSON.stringify(nodes)
    以上语名节点超过19或21项时,解析出来的json数据经过在线JSON校验格式化工具校验后是有效数据,但就是不执行后台程序。仔细查看以上语句获取的数据后,发现节点附带的属性太多,需要的属性只有几个,因此决定只提取需要的属性,其他属性完全舍弃,结果不管节点是多少项,后台程序都正确执行。
    var nodes = zTreeObj.transformToArray(zTreeObj.getNodes());
    var nodesArr = new Array(allNodes.length);
    // 提取需要的属性
    for (i = 0; i < allNodes.length; i++)
    {
    nodesArr[i] = { "id": allNodes[i].id.toString(), "pId": allNodes[i].pId.toString(), "name": allNodes[i].name.toString()};
    }
    $.ajax({
    url: "/Courseware/SummitCourseResources?id=" + *@ViewData["id"]*,
    contentType: "application/json",
    type: "post",
    data: JSON.stringify(nodesArr),
    dataType: "json",
    async: true,
    cache: false
    });


    IP属地:云南3楼2014-09-03 16:34
    回复
      有点错误,请把allNodes全改为nodes。


      IP属地:云南4楼2014-09-03 16:37
      回复
        感谢吧主回复邮件,以下是吧主回复的解决办法:
        zTree 节点 的 json 数据中会产生大量 内部使用的属性, 所以当你把数据返回到后台的之前,一定要自己处理一遍(例如 clone 一下), 在 clone 的同时, 只选择你需要用到的属性, 其余的一概不要。。。
        另外, 父节点的 json 数据中有 children 属性,它保存了 子节点的数据,所以 这个会导致你的数据中 产生大量的重复内容。。。可能也会导致你的数据量激增。。。从而影响了 ajax 的正常执行
        请按照我说的方法,进行处理后,应该是可以正常工作的了


        IP属地:云南5楼2014-09-04 09:39
        收起回复
          再补充一点:
          如果json数据大于30k左右的时候,后台也会不服务,在web.config中的<appSettings>增加以下配置,即可解决此问题。
          <add key="aspnet:MaxJsonDeserializerMembers" value="1500000000" />


          IP属地:云南6楼2014-09-05 12:59
          收起回复