AJAX後台網站的最後一塊拼圖 Flexigrid (2)
上一篇說到如何在Client端宣告flexigrid物件
以及如何修改程式讓flexigrid能把參數丟給ASP.NET的PageMethod
而這邊重點就擺在要ASP.NET要怎麼處理
=================================================================================================
四、Flexigrid會丟哪些參數到Server端
1. page - 定義的是第幾頁, 但要注意的是, SQL習慣從0開始當第一頁, flexigrid卻是由1開始當第一頁, 這要特別處理
2. rp - 定義的是一頁幾筆資料, 配合第幾頁可以實做出分頁的功能
3. qtype - 定義的是要查詢哪個欄位, (不一定有值)
4. query - 定義的是要查詢什麼值, (不一定有值) (配合這兩個參數可以實作出Where的功能, 例如說LIKE之類的篩選)
5. sortname - 定義的是要從哪個欄位排序
6. sortorder - 定義的是排序的方向是什麼
基本上有了這些屬性, 我們可以組合成一段結合了CTE分頁, WHERE模糊比對, 加上排序的SQL, 再丟進資料庫取出Table組成Entity
又或著要用LINQ, 還是Entity FrameWork都隨意, 總之就是取出對應的資料
(我都已經習慣將取出來的DataSet作自動物件化之後再操作, 因此範例幾乎不會有操作DataSet的內容, 請見諒)
=================================================================================================
五、PageMethod要怎麼接flexigrid丟過來的參數
/// <param name="page">第幾頁, 由1開始</param>
/// <param name="rp">一頁幾筆</param>
/// <param name="qtype">要Where哪個欄位</param>
/// <param name="query">Where的值是什麼</param>
/// <param name="sortname">要排序哪個欄位</param>
/// <param name="sortorder">排序的方向是什麼</param>
[System.Web.Services.WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static FlexigridTable GetTable(int page, int rp, string qtype, string query, string sortname, string sortorder)
{
FlexigridTable fd = new FlexigridTable();
Student[] students = //balh balh, 總之就是利用那些參數組成sql取出查詢後的結果,
fd.page = page;
fd.total = students.length;
if (students != null && students.Length > 0)
{
foreach (Student item in students)
{
FlexigridRow newRow = new FlexigridRow();
newRow.id = item.StudentId.ToString();
List<string> cell = new List<string>();
cell.Add(item.Name);
cell.Add(item.Age.ToString());
newRow.cell = cell;
fd.rows.Add(newRow);
}
}
return fd;
}
可以看到PageMethod大致長這樣
簡單說明就是, 使用傳入的參數找出對應的值之後,
放入依照Flexigrid預設的格式所建立的類別中,
再丟回Client端, Flexigrid自動就會把這些資料組合成一個動態Table了
=================================================================================================
六、Flexigrid看得懂什麼樣的格式
將剛才使用的FlexigridTable跟FlexigridRow格式列如下
public class FlexigridTable
{
public int page { get; set; }
public int total { get; set; }
private List<FlexigridRow> _rows = new List<FlexigridRow>();
public List<FlexigridRow> rows
{
get { return _rows; }
set { _rows = value; }
}
}
public class FlexigridRow
{
public FlexigridRow(int id)
{
this.id = id.ToString();
cell = new List();
}
public FlexigridRow()
{
id = "-999";
cell = new List();
}
public string id { get; set; }
public List cell { get; set; }
}
可以看到屬性其實很單純
row要紀錄的就是他的id => 會被產生成 <tr id="id-{id}" />
以及string[], 這些string則會依照順序被放入td當中
而table要紀錄的則是
目前在第幾頁(page), 總共有幾筆資料(total) => 會被計算出來總共有幾頁 現在在第幾頁, 並且秀在頁面上
以及這頁有幾行資料(List<FlexigridRow>)
=================================================================================================
七、常用的Function
最常用的應該是這兩個吧
$.fn.flexReload = function(p) { // function to reload grid
return this.each( function() {
if (this.grid&&this.p.url) this.grid.populate();
});
}; //end flexReload
$.fn.flexOptions = function(p) { //function to update general options
return this.each( function() {
if (this.grid) $.extend(this.p,p);
});
}; //end flexOptions
簡單解釋, 第一個是重新讀取Table資料, 使用方法像是$('#detailTable').flexReload();
第二個則是變更已經定義好的option, 使用方法像是$('#detailTable').flexOptions({ newp: 1, sortname: 'name' }).flexReload();
這段的意思是, 我變更回第一頁, 並且用name這個欄位重新排序, 接著讀取Table資料
也就是說, 不用受限於只有點欄位才能用那個欄位排序, 一樣可以用程式控制現在要用哪個欄位排序
要特別注意的是, 雖然PageMethod接到的是page
要用options換頁卻是要用newp, 這個很容易被忽略
=================================================================================================
經過這些步驟, 基本上就已經做出一個動態可以秀資料的Table
而當你的使用者發現他可以隨便點哪一個欄位都可以排序, 隨便哪個欄位都可以搜尋
而且速度快很多(都用AJAX), 它們會非常訝異的
之後要怎麼應用, 例如說新增, 修改, 刪除等
或著要怎麼把新的參數加進去, 又或著是怎麼利用分類select去再次進一步的篩選資料
有機會再分享進階的應用在這邊
而當用習慣之後, 就會自己再去寫一堆函式進去
像我自己就在寫了一個js class flexHelper
裡面就有一堆for Flexigrid的工具
例如說用id選擇tr
tr上下移動換位子
取得某個欄位的內容之類的小工具
若有人有興趣再做交流了
--
本文可能有理解錯誤 或不盡不實的地方
請路過的前輩不要客氣 用力打醒
這會是我們成長的主要養分