1. 程式人生 > >基於MVC4+EasyUI的Web開發框架經驗總結(9)--在Datagrid裡面實現外來鍵欄位的轉義操作

基於MVC4+EasyUI的Web開發框架經驗總結(9)--在Datagrid裡面實現外來鍵欄位的轉義操作

我們在使用EasyUI的時候,很多情況下需要使用到表格控制元件datagrid,這個控制元件控制元件非常強大,使用起來很簡潔,但是我在使用中,發現對於一個表裡面的外來鍵欄位進行轉義,並顯示引用表的一些名稱的操作,卻顯得比較難以實現,找了很多資料,基本上沒有找到對應的解決方案。本文主要介紹我對這種外來鍵欄位轉義的操作的實現方式,以便供大家參考瞭解。

1、DataGrid的初始化操作

在瞭解對內容的解析前,我們先來了解EasyUI裡面Datagrid的初始化操作過程,然後逐步進行分析,尋求解決方式。

一般情況下,Datagrid內容的初始化程式碼如下所示,注意下面紅色部分的內容Customer_ID,就是我們需要轉換為客戶名稱的處理。因為我們這裡返回的表資料包含了一個外來鍵ID:Customer_ID,我需要把它轉換一下客戶的名稱。

        //實現對DataGird控制元件的繫結操作
        function InitGrid(queryData) {
            $('#grid').datagrid({   //定位到Table標籤,Table標籤的ID是grid
                url: '/Contact/FindWithPager',   //指向後臺的Action來獲取當前使用者的資訊的Json格式的資料
                title: '客戶聯絡人', 
                iconCls: 'icon-view',
                height: 
650, width: function () { return document.body.clientWidth * 0.9 },//自動寬度 nowrap: true, autoRowHeight: false, striped: true, collapsible: true, pagination: true, pageSize: 50, pageList: [
50, 100, 200], rownumbers: true, //sortName: 'Seq', //根據某個欄位給easyUI排序 sortOrder: 'asc', remoteSort: false, idField: 'ID', queryParams: queryData, //非同步查詢的引數 columns: [[ { field: 'ck', checkbox: true }, //選擇 { title: '客戶ID', field: 'Customer_ID', width: 180, sortable: true}, { title: '編號', field: 'HandNo', width: 80, sortable: true }, { title: '姓名', field: 'Name', width: 80, sortable: true }, { title: '身份證號碼', field: 'IDCarNo', width: 120, sortable: true }, { title: '出生日期', field: 'Birthday', width: 120, sortable: true, formatter: function (value, rec, index) { if (value == undefined) { return ""; } if ((value + '').indexOf('1900') == 0) { return ""; } return value; } } ]], toolbar: [{ id: 'btnAdd', text: '新增', iconCls: 'icon-add', handler: function () { ShowAddDialog();//實現新增記錄的頁面 } }, '-', { id: 'btnEdit', text: '修改', iconCls: 'icon-edit', handler: function () { ShowEditOrViewDialog();//實現修改記錄的方法 } }, '-', { id: 'btnDelete', text: '刪除', iconCls: 'icon-remove', handler: function () { Delete();//實現直接刪除資料的方法 } }, '-', { id: 'btnView', text: '檢視', iconCls: 'icon-table', handler: function () { ShowEditOrViewDialog("view");//實現檢視記錄詳細資訊的方法 } }, '-', { id: 'btnReload', text: '重新整理', iconCls: 'icon-reload', handler: function () { //實現重新整理欄目中的資料 $("#grid").datagrid("reload"); } }], onDblClickRow: function (rowIndex, rowData) { $('#grid').datagrid('uncheckAll'); $('#grid').datagrid('checkRow', rowIndex); ShowEditOrViewDialog(); } }) };

2、嘗試失敗的操作

1)使用格式化函式Formatter

針對以上的處理,有些人可能很快就想到使用格式化Formatter來實現了,一般情況下處理轉義和自定義顯示操作,非此莫屬。

有可能想使用的程式碼如下所示。

                      {
                          title: '客戶名稱', field: 'Customer_ID', width: 180, sortable: true,
                          formatter: function (value, row) {
                              $.ajaxSettings.async = false;
                              $.getJSON("/Customer/GetCustomerName?id=" + value, function (result) {
                                  return "<span>" + result + "</span>";
                              });
                          }
                      },

但是,如果這樣做,你會發現格式化函式沒有辦法呼叫ajax的操作,獲取對應的資料,也就是無法進行解析客戶的ID為名稱。因此這種方法,失敗!

2)使用onLoadSuccess函式

這個onLoadSuccess函式,本意就是在Datagrid順利載入後執行的函式,一般情況下,我想在載入後,在更新表格裡面的資料,如下面的程式碼所示。

                onLoadSuccess: function (data) {
                    var rows = $("#grid").datagrid("getRows");
                    if (rows.length >= 1) {
                        for (var i = 0; i < rows.length; i++) {
                            $.getJSON("/Customer/GetCustomerName?id=" + rows[i].Customer_ID, function (result) {
                                $('#grid').datagrid('updateRow', { index: 0, row: { field: result } });
                            });
                        }
                    }
                }

下面的方法也是通過Ajax的方式獲取資料,然後進行更新,不過很不幸,也不通過,無法正常解析。

3、成功解析的方式

好了,既然無法通過上面指令碼的方式來進行解析,我們通過曲線救國的方式,應該也是可以的。

由於Datagrid顯示的資料是下面的方式就可以的

            var result = new { total = list.Count, rows = list };

那麼我們在返回資料給datagrid的控制器函式裡面,對返回的內容,增加一個“客戶名稱”的資訊,應該就可以了。

1)轉換內容為DataTable並增加欄位

但是我的框架裡面,返回的內容都設定為了List<T>的這種方式,也就是T代表的是實體類,我們很難改變實體類裡面的屬性並賦值,那麼我們也可以把它轉換為DataTable了。

            //增加一個客戶名稱欄位,然後進行解析,構建一個DataTable返回
            DataTable dtReturn = DataTableHelper.ListToDataTable<ContactInfo>(list);
            dtReturn.Columns.Add("CustomerName");

            foreach (DataRow row in dtReturn.Rows)
            {
                row["CustomerName"] = BLLFactory<Customer>.Instance.GetCustomerName(row["Customer_ID"].ToString());
            }
            var result = new { total = dtReturn.Rows.Count, rows = dtReturn };

通過函式DataTableHelper.ListToDataTable<ContactInfo>(list);可以把列表的內容構建成一個DataTable的內容,並增加一個CustomerName的欄位,然後遍歷每一行,填入解析Customer_ID後的名稱,並返回記錄就可以了。

在視圖裡面,我們通過增加一個欄位進行繫結就可以了,如下所示。

                      {
                          title: '客戶ID', field: 'Customer_ID', width: 180, sortable: true, hidden:true
                      },
                      { title: '客戶名稱', field: 'CustomerName', width: 180, sortable: true },

2)在實體類基類增加一些額外的欄位屬性

剛才我們看到,把實體類列表轉換為DataTable,然後並遍歷賦值,挺麻煩的一件事,也可能影響一些效能,如果我們實體類裡面有一些備用的屬性作為內容解析,在介面上直接使用這些備用屬性就可以了,這樣會更加方便。

因此我在所有實體類的基類裡面增加三個屬性,Data1、Data2、Data3,有點類似Visio模具形狀的屬性設定了,呵呵。

    /// <summary>
    /// 框架實體類的基類
    /// </summary>
    [DataContract]
    public class BaseEntity
    {
        #region 在實體類儲存一些特殊的資料
        /// <summary>
        /// 用來給實體類傳遞一些額外的資料,如外來鍵的轉義等,該欄位不儲存到資料表中
        /// </summary>
        [DataMember]
        public string Data1 { get; set; }

        /// <summary>
        /// 用來給實體類傳遞一些額外的資料,如外來鍵的轉義等,該欄位不儲存到資料表中
        /// </summary>
        [DataMember]
        public string Data2 { get; set; }

        /// <summary>
        /// 用來給實體類傳遞一些額外的資料,如外來鍵的轉義等,該欄位不儲存到資料表中
        /// </summary>
        [DataMember]
        public string Data3 { get; set; } 
        #endregion
    }

有了這些備用的屬性,我們就可以解決外來鍵轉義的內容儲存問題了。

在查詢裡面,我們只需要遍歷一次,把轉換好的內容賦值給對應的實體類屬性就好了。

            foreach (ContactInfo info in list)
            {
                //增加一個特殊欄位的轉義
                info.Data1 = BLLFactory<Customer>.Instance.GetCustomerName(info.Customer_ID);
            }

最後在視圖裡面,我們的程式碼如下所示。

                      {
                          title: '客戶ID', field: 'Customer_ID', width: 180, sortable: true, hidden:true
                      },
                      { title: '客戶名稱', field: 'Data1', width: 180, sortable: true },

主介面裡面的列表展示如下所示。

資料匯入介面裡面的列表展示如下所示。

基於MVC4+EasyUI的Web開發框架的系列文章:

相關推薦

基於MVC4+EasyUI的Web開發框架經驗總結13--DataGrid控制元件實現自動適應寬頻高度

在預設情況下,EasyUI的DataGrid好像都沒有具備自動寬度的適應功能,一般是指定畫素寬度的,但是使用的人員計算機的螢幕解析度可能不一樣,因此導致有些地方顯示太大或者太小,總是不能達到好的預期效果,如果DataGrid能夠根據視窗尺寸進行伸縮,效果應該好很多。本文主要介紹DataGrid控制元件實現自動

基於MVC4+EasyUI的Web開發框架經驗總結9--在Datagrid裡面實現外來轉義操作

我們在使用EasyUI的時候,很多情況下需要使用到表格控制元件datagrid,這個控制元件控制元件非常強大,使用起來很簡潔,但是我在使用中,發現對於一個表裡面的外來鍵欄位進行轉義,並顯示引用表的一些名稱的操作,卻顯得比較難以實現,找了很多資料,基本上沒有找到對應的解決方案。本文主要介紹我對這種外來鍵欄位轉義

基於Metronic的Bootstrap開發框架經驗總結9--實現Web頁面內容的列印預覽和儲存操作

在前面介紹了很多篇相關的《Bootstrap開發框架》的系列文章,這些內容基本上覆蓋到了我這個Bootstrap框架的各個主要方面的內容,總體來說基本達到了一個穩定的狀態,隨著時間的推移可以會引入一些更好更新的內容進行完善,本篇繼續這個系列,主要介紹如何實現Web頁面內容的列印預覽和儲存操作。 1、Web頁

基於Metronic的Bootstrap開發框架經驗總結9--實現Web頁面內容的打印預覽和保存操作

復制 metronic ports 分享 idt details func git 獲取 在前面介紹了很多篇相關的《Bootstrap開發框架》的系列文章,這些內容基本上覆蓋到了我這個Bootstrap框架的各個主要方面的內容,總體來說基本達到了一個穩定的狀態,隨著時間的推

基於MVC4+EasyUI的Web開發框架經驗總結5--使用HTML編輯控件CKEditor和CKFinder

err config 兩個 腳本 web開發 upload asp 正常 初始 http://www.cnblogs.com/wuhuacong/p/3780356.html Web開發上有很多HTML的編輯控件,如CKEditor、kindeditor等等,很多都做的很

基於MVC4+EasyUI的Web開發框架經驗總結2- 使用EasyUI的樹控件構建Web界面

set 應用 get ember trim ase str zab ble http://www.cnblogs.com/wuhuacong/p/3669575.html 最近花了不少時間在重構和進一步提煉我的Web開發框架上,力求在用戶體驗和界面設計方面,和Winfor

基於MVC4+EasyUI的Web開發框架經驗總結6--在頁面中應用下拉列表的處理

ica new web開發 don ext images 如果 bob 獲取 http://www.cnblogs.com/wuhuacong/p/3840321.html 在很多Web界面中,我們都可以看到很多下拉列表的元素,有些是固定的,有些是動態的;有些是字典內容,

基於MVC4+EasyUI的Web開發框架經驗總結8--實現Office文檔的預覽

討論 off info code .cn viewer 存在 nco app http://www.cnblogs.com/wuhuacong/p/3871991.html 基於MVC4+EasyUI的Web開發框架經驗總結(8)--實現Office文檔的預覽

基於MVC4+EasyUI的Web開發框架經驗總結1-利用jQuery Tags Input 外掛顯示選擇記錄

最近花了不少時間在重構和進一步提煉我的Web開發框架上,力求在使用者體驗和介面設計方面,和Winform開發框架保持一致,而在Web上,我主要採用EasyUI的前端介面處理技術,走MVC的技術路線,在重構完善過程中,很多細節花費不少時間進行研究和提煉,一步步走過來,也積累了不

基於MVC4+EasyUI的Web開發框架經驗總結3- 使用Json實體類構建選單資料

最近花了不少時間在重構和進一步提煉我的Web開發框架上,力求在使用者體驗和介面設計方面,和Winform開發框架保持一致,而在Web上,我主要採用EasyUI的前端介面處理技術,走MVC的技術路線,在重構完善過程中,很多細節花費不少時間進行研究和提煉,一步步走過來,也積累了不少經驗,本系列將主要介紹我在進一步

基於MVC4+EasyUI的Web開發框架經驗總結4--使用圖表控制元件Highcharts

在我們做各種應用的時候,我們可能都會使用到圖表統計,以前接觸過一些不同的圖表控制元件,在無意中發現了圖表控制元件Highcharts,其強大的功能和豐富的互動效果,令人難以忘懷。本篇主要介紹在Web開發中使用圖表控制元件Highcharts,以及對其進行統一漢化等操作,讓我們的程式功能更加豐富,內容更加美觀。

基於MVC4+EasyUI的Web開發框架經驗總結2- 使用EasyUI的樹控制元件構建Web介面

最近花了不少時間在重構和進一步提煉我的Web開發框架上,力求在使用者體驗和介面設計方面,和Winform開發框架保持一致,而在Web上,我主要採用EasyUI的前端介面處理技術,走MVC的技術路線,在重構完善過程中,很多細節花費不少時間進行研究和提煉,一步步走過來,也積累了不少經驗,本系列將主要介紹我在進一步

基於MVC4+EasyUI的Web開發框架經驗總結7--實現省份、城市、行政區三者聯動

為了提高客戶體驗和進行一些技術探索,現在正準備把我自己的客戶關係管理系統CRM在做一個Web的版本,因此對基於MVC的Web介面繼續進行一些研究和優化,力求在功能和介面上保持和Winform一致,本文主要介紹在我的CRM系統中用到的全國省份、城市、行政區三者的兩種效果,在Winform上實現沒問題,在Web上

基於MVC4+EasyUI的Web開發框架經驗總結6--在頁面中應用下拉列表的處理

在很多Web介面中,我們都可以看到很多下拉列表的元素,有些是固定的,有些是動態的;有些是字典內容,有些是其他表裡面的名稱欄位;有時候引用的是外來鍵ID,有時候引用的是名稱文字內容;正確快速使用下拉列表的處理,可以提高我們程式介面的美觀性和友好型,本文主要介紹在我的Web開發框架以及相關的擴充套件Web應用中用

基於MVC4+EasyUI的Web開發框架經驗總結14--自動生成圖示樣式檔案和圖示的選擇操作

在很多Web系統中,一般都可能提供一些圖示的選擇,方便配置按鈕,選單等介面元素的圖示,從而是Web系統介面看起來更加美觀和協調。但是在系統中一般內建的圖示樣式相對比較有限,而且硬編碼寫到樣式表裡面,這樣給我們擴充套件使用有很多的不方便。基於這個原因,我想如果能夠獨立一個模組,自動根據圖示生成圖示CSS樣式檔案

基於MVC4+EasyUI的Web開發框架經驗總結11--使用Bundles處理簡化頁面程式碼

在Web開發的時候,我們很多時候,需要引用很多CSS檔案、JS檔案,隨著使用更多的外掛或者獨立樣式檔案,可能我們的Web介面程式碼會越來越臃腫,看起來也很累贅,在MVC裡面提供了一個Bundle的物件,用來簡化頁面程式碼非常方便,本文主要介紹在我的MVC框架裡面,如何使用bundles來簡化頁面的程式碼的。

基於MVC4+EasyUI的Web開發框架經驗總結8--實現Office文件的預覽

在部落格園很多文章裡面,曾經有一些介紹Office文件預覽檢視操作的,有些通過轉為PDF進行檢視,有些通過把它轉換為Flash進行檢視,但是過程都是曲線救國,真正能夠簡潔方便的實現Office文件的預覽的還是比較少,這裡的Office文件包括了Word、Excel、PPT文件。本文介紹兩種方式,一種方式是通過

基於MVC4+EasyUI的Web開發框架經驗總結5--使用HTML編輯控制元件CKEditor和CKFinder

Web開發上有很多HTML的編輯控制元件,如CKEditor、kindeditor等等,很多都做的很好,本文主要介紹在MVC介面裡面,CKEditor的配置和使用。CKEditor的前身是FCKEditor,隨著它的更新,上傳圖片的功能被分離出去了,現在如果需要實現上傳圖片,要麼自己寫程式碼或者採用其他上傳控

基於MVC4+EasyUI的Web開發框架經驗總結10--在Web介面上實現資料的匯入和匯出

資料的匯入匯出,在很多系統裡面都比較常見,這個匯入匯出的操作,在Winform裡面比較容易實現,我曾經在之前的一篇文章《Winform開發框架之通用資料匯入匯出操作》介紹了在Winform裡面的通用匯入匯出模組的設計和開發過程,但在Web上我們應該如何實現呢?本文主要介紹利用MVC4+EasyUI的特點,並結

基於MVC4+EasyUI的Web開發框架經驗總結12--利用Jquery處理資料互動的幾種方式

在基於MVC4+EasyUI的Web開發框架裡面,大量採用了Jquery的方法,對資料進行請求或者提交,方便頁面和伺服器後端進行資料的互動處理。本文主要介紹利用Jquery處理資料互動的幾種方式,包括獲取資料並顯示,插入新資料到伺服器,更新資料,刪除資料等操作。 1、利用Jquery獲取資料並顯示 為了順