[收藏]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; }
}
}
其它的就是更新到数据库了。就写到这里吧 !
声明:本人知识有限,文章中有的地方阐述可能欠妥或值得商榷,敬请原谅!写下本文的初衷是做个记录以备日后之用,如能对大家有所帮助,实属意外收获啊,呵呵。欢迎指出问题,最好能提供解决之道,以供大家交流学习!谢谢!
欢迎拍砖,鄙视言辞不文明的人!嘿嘿。