[收藏]Jquery客户端拖拽排序方法

原理:客户端排序(或者说组织新的排序顺序),Ajax 更新服务器端数据。

      客户端用jquery插件sortable实现拖拽排序,保存之前检索顺序变化了的数据,并组织成Json数据,用AJax传送到服务器端的处理文件(这里用的是一般处理文件),进行数据库的更新。难点之处在于如何检测出顺序变化了的数据,或者说如何标示状态变化的数据。本文没有实现如何去标示顺序变化的数据,而是保存了数据初始化时的顺序(注:orderid 的顺序表中有排序字段orderid),在排序结束之后保存之前,再一次获取当前的数据排序顺序(orderid 的顺序),在比较这两个数组,若相应索引处数据不一样即认为顺序发生了改变,此时再获取产品的ID和新的顺序ID(orderid),组织成Json格式发送到服务器进行更新 。大体思路是这样,可能方法比较笨啊,如果各位有好的方法或建议请留言交流,谢谢!

如何实现:

1、客户端代码

    <script src="json2.js" type="text/javascript"></script>                                       //客户端用来转换Json字符串
    <script src="jquery-1.4.2.min.js" type="text/javascript"></script>                      //Jquery 文件

    <script src="jquery-ui-1.8.2.custom.min.js" type="text/javascript"></script>     //Jquery 排序插件
   
    <script>
        $(function() {

            //存储初始化时数据的排序顺序
            var orderid = new Array();
            $("tr:not(:first)").each(function() {
                orderid.push($(this).find('span').text());
            });

            //让Gridview支持拖拽功能,去掉表头不让其能够拖动
            $('#GridView1').sortable({ items: 'tr:not(:first)' });

            //保存按钮事件
            $("#newid").click(function() {
                var idorder = new Array(); //保存新的数据排序顺序
                var arr = new Array();       //保存顺序发生变化的数据,用于提交到服务器
                var proid, newid;
                initialize(idorder);

                //遍历查找顺序发生了变化的数据

                for (var key in orderid) {
                    if (orderid[key] != idorder[key]) {

                        proid = $('span[title="' + idorder[key] + '"]').parents("tr").children(":first").html();
                        newid = orderid[key];
                       //  alert($('span[title="' + idorder[key] + '"]').parents("tr").children(":first").html() + '        ' + orderid[key]);

                        arr.push(new orderinfo(proid, newid));
                    }

                }
              //  alert(JSON.stringify(arr));

                //发送Ajax请求
                $.post( 'Handler2.ashx', {data: JSON.stringify(arr)},function(){                
                 alert('Success');
                } );
            });
        })

        //用于初始化数组

        function initialize(obj) {
            $("tr:not(:first)").each(function() {
            obj.push($(this).find('span').text());
            });

        }

    //对象方式组织顺序变化的数据

        function orderinfo(proid, orderid) {
            this.proid = proid;
            this.orderid = orderid;
        }
    </script>

2、服务器端代码

     服务器处理客户端Post来的Json字符串,将其序列化为对象的格式。采用第三方插件(不知对否)Newtonsoft.Json.dll.

引用命名空间:using Newtonsoft.Json;

使用其JsonConvert.DeserializeObject<>()方法序列化数据

  string txt = context.Request["data"];

   List<info> products=JsonConvert.DeserializeObject<List<info>>(txt);

此处的info(类)是一个与客户端的orderinfo函数相对应(私有字段的名称需要一致,因为要做序列化) (注:这个地方的阐述可能有点问题)

 public  class info{
 
   public info()
   {
  
   }
      public info(string proid, string orderid)
        {
            this.ProID = proid;
            this.OrderID = orderid;
         
        }
      private string proid;

        public string ProID
        {
            get { return proid; }
            set { proid = value; }
        }

        private string orderid;

        public string OrderID
        {
            get { return orderid; }
            set { orderid = value; }
        }
 }

其它的就是更新到数据库了。就写到这里吧 !

声明:本人知识有限,文章中有的地方阐述可能欠妥或值得商榷,敬请原谅!写下本文的初衷是做个记录以备日后之用,如能对大家有所帮助,实属意外收获啊,呵呵。欢迎指出问题,最好能提供解决之道,以供大家交流学习!谢谢!

 欢迎拍砖,鄙视言辞不文明的人!嘿嘿。

posted @ 2010-07-16 09:53  chunchill  阅读(885)  评论(0编辑  收藏  举报