Asp.net Ajax實現拖放實戰

來源:互聯網
上載者:User

    摘要:關於Asp.net Ajax架構來實現拖放有多種方式,http://www.cncms.com.cn/ajax/10093_2.htm。
比較簡單的一種是用AjaxControlToolkit中的伺服器控制項如DragPanelExtender等
但是在效率和拖放之間資料的交換細節等方面與實際應用有些偏差。估完全採用客戶實現IDragSource和IDropTarget介面。
可以先參考陳黎夫先生的http://www.cnblogs.com/dflying/archive/2007/05/29/763564.html

    項目背景:本功能是為了實現事業單位的績效考核系統中的一個評分模組。評分有很多評分的指標,指標下面有子指標,末級
指標下面有具體評分的考核點,每個考核點根據基本的考核量表來評分。同時,評分的介面可以有多種展示,第一種可以點擊
每個評分點進去打分,第二種就是給定一個excel表似的試卷一樣的頁面。而拖放效果的實現,是要求在第一種評分方式下將
被考核人員,直接拖動到對應的分值地區內。
根據業務需求,因此陳黎夫先生的例子,在這裡有很多需要擴充的地方。因此這篇文章給對Asp.net Ajax架構用戶端實現拖放
有一定瞭解的朋友。
1)需要實現回拖,就是說已經拖放到評分地區的元素,要可以拖回到原來的地區。
2)可以被投放的地區,也要互相實現拖放
3)在自己的地區拖放要被屏蔽
4)在拖放的時候,相關的資料對象要適當的儲存
5)拖放結束後評分的結果要保持到資料庫,重新開啟這個頁面時,得到相應分數的人應該自動被添加相應的得分地區,並且
相應的元素要添加被拖放到行為,被投放的地區添加可以被投放的行為。
綜上幾點,陳黎夫先生的例子只能限於示範微軟的ajax拖放技術,對於實用階段還有一定的距離。

 

直觀介面如下:

 

實現本項目的需要需要做到以下幾點
1)同樣的資料,有多種顯示要求。所以整個介面使用xml+xslt技術產生。大家參考我以前關於xml+xslt的文章
2)實現拖放,將陳黎夫先生的例子複製過來改改拖放就可以實現了。
3)需要實現回拖,就是說已經拖放到評分地區的元素,要可以拖回到原來的地區。
將每個地區註冊為可以投放的地區

頁面初始化時,將要投放的地區迴圈,添加可以投放的行為
$create(Score.DropPersonBehavior, { "id": id, "name": "personDropBehavior" + id }, null, null, this);

將要拖放的元素添加可以拖放的行為,
$create(Score.DraggablePersonBehavior, { "person": person, "name": "personDragBehavior" + i }, null, null, li);

每個元素拖放結束後,註冊為可以拖放的行為
drop: function(dragMode, dataType, data)
{
 if (dataType == 'Person' && data)
 {
     var rectId = parseInt(this.get_id());
     if (rectId == 500)
  Array.add(dropRectSource, data);
     else
  Array.add(dropRect[rectId], data);
     var li = document.createElement("LI");
     li.innerHTML = data.PersonName + '[' + data.OrgName + ']';
     li.className = 'personlistcls';
     li.id = 'li_' + rectId + '_' + data.Id;
     if (this.get_element().getElementsByTagName("LI").length == 0) this.get_element().innerHTML = '';
     this.get_element().appendChild(li);
     this.get_element().style.backgroundColor = "#ffffff";

     $create(Score.DraggablePersonBehavior, { "person": data }, null, null, li);
 }
},
然後將原來的行為登出
onDragEnd: function(canceled)
{
 //if (sourceRectIndex == targetRectIndex) return;
 if (this._visual) this.get_element().parentNode.removeChild(this._visual);
 if (!canceled)
 {
     var sid = parseInt(this.get_element().id.split('_')[1]);
     this.get_element().parentNode.removeChild(this.get_element());
     if (sid == '500')
  Array.remove(dropRectSource, this._person);
     else
  Array.remove(dropRect[sid], this._person);
     this.dispose();
 }
},

4)在拖放的時候,相關的資料對象要適當的儲存
在頁面初始化時,根據評分地區的多少,迴圈評分地區,為每個地區添加一個數組。然後伴隨每次拖放將資料動態儲存到相應的數組中

5)拖放結束後評分的結果要保持到資料庫,重新開啟這個頁面時,得到相應分數的人應該自動被添加相應的得分地區,並且
相應的元素要添加被拖放到行為,被投放的地區添加可以被投放的行為。

在頁面pageLoad的時候(用戶端)發送ajax請求,將每個已經評分的人員的資訊產生xml返回
然後迴圈子節點。然後根據子節點的資訊添加到相應地區,添加相應的行為。

綜上總結幾點
1)jQuery操作元素比較方便
2)asp.net Ajax對javascript內建的對象的擴充使用比較方便
3)asp.net ajax架構getLocation計算元素位置方法有很大的局限性
4)對於實現拖放其實PreviewDragDrop.js內對IDragSource和IDropTarget介面提供了預設實現的類,和DragDropList等
合理繼承這些類,可以極大的減少用戶端寫大量代碼的量。建議大家好好研究PreviewDragDrop.js

 

主要是js操作,附拖放的js下載:http://files.cnblogs.com/jackhuclan/PersonDragDrop.rar

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.