1. 程式人生 > >在MVC控制器裡面使用dynamic和ExpandoObject,實現資料轉義的輸出

在MVC控制器裡面使用dynamic和ExpandoObject,實現資料轉義的輸出

在很多時候,我們在資料庫裡面定義表字段和實際在頁面中展示的內容,往往是不太匹配的,頁面資料可能是多個表資料的綜合體,因此除了我們在表設計的時候考慮周到外,還需要考慮資料展現的處理。如果是常規的處理,那麼需要對部分外來鍵欄位進行特別的轉義處理,如果需要增加多一些欄位,那麼這種處理可能就相對比較麻煩一些。本文介紹如何在MVC控制器裡面使用dynamic和ExpandoObject,實現資料轉義後一體化的輸出,包括增加任意多的欄位資訊。

1、資料資訊的展示

一般情況下,我們在介面裡面展示的資訊是相對比較豐富的,儘管我們設計資料表的時候,考慮的是如何精簡且避免重複,但是在介面上展示的資訊,往往是考慮如何讓使用者更加方便,因此可能儘可能的展示相關資訊。

如對於這樣的場景,裝置資訊作為主要的基礎資訊,其相關的業務包括裝置檢查、裝置維護、裝置報修等資訊,如下所示。

基於上面的資料設計,我們如果在展示裝置檢查、裝置維護、裝置報修等資訊的時候,那麼我們一般還需要展示部分的裝置基礎資訊,這樣我們更容易瞭解整個記錄資料,但是我們在資料設計的時候,是把它們分開的,因此需要在輸出到介面的時候,把它們綜合起來。

我們來看看我最終通過這種方式實現的介面效果,之後我們再來一步步介紹如何實現這個操作過程的。

2、資料轉義的實現

在上面的介面效果裡面,我們是基於MVC實現後臺的處理,在介面上利用Bootstrap進行展示的(利用EaysUI元件也是類似的處理)。我們分為兩部分進行介紹實現的,一部分是採用MVC的輸出資料,一部分是介面的展示。

1)MVC的控制器資料處理

在MVC裡面,我們一般通過基類的FindWithPager進行資料的分頁處理,基於如何在MVC控制器裡面實現資料的分頁處理,大家感興趣可以參考《基於Metronic的Bootstrap開發框架經驗總結(2)--列表分頁處理和外掛JSTree的使用》隨筆進行了解。

常規的做法,如果是主表資訊,我們可以把它們簡單的輸出,如下所示。

        public override ActionResult FindWithPager()
        {
            //檢查使用者是否有許可權,否則丟擲MyDenyAccessException異常
base.CheckAuthorized(AuthorizeKey.ListKey); string where = GetPagerCondition(); PagerInfo pagerInfo = GetPagerInfo(); List<DeviceInfo> list = baseBLL.FindWithPager(where, pagerInfo); //Json格式的要求{total:22,rows:{}} //構造成Json的格式傳遞 var result = new { total = pagerInfo.RecordCount, rows = list }; return ToJsonContentDate(result); }

也就是不需要經過任何轉義就直接把查詢到的資料列表輸出給呼叫者,由介面進行資料的篩選處理。

如果對於上面提到的裝置檢查、裝置維修等和裝置資訊相關的,我們就需要利用dynamic和ExpandoObject,把裝置資訊整合一起提供給介面了,具體程式碼如下所示。

我們首先對查詢的記錄進行遍歷,把每條記錄進行轉換,如下所示。

            List<ExpandoObject> objList = new List<ExpandoObject>();
            foreach (DeviceCheckInfo info in list)
            {
                dynamic obj = new ExpandoObject();

注意上面我們定義了List<ExpandoObject>的列表和dynamic obj的物件,這樣我們通過動態定義的物件,把我們需要的欄位屬性加到動態物件裡面,然後放到集合裡面即可。

完整的分頁控制器程式碼如下所示。

        public override ActionResult FindWithPager()
        {
            //檢查使用者是否有許可權,否則丟擲MyDenyAccessException異常
            base.CheckAuthorized(AuthorizeKey.ListKey);

            string where = GetPagerCondition();
            PagerInfo pagerInfo = GetPagerInfo();
            List<DeviceCheckInfo> list = baseBLL.FindWithPager(where, pagerInfo);

            //裝置編碼    所屬科室    品牌    品類    型號    裝置序列號    檢查時間    處理人
            List<ExpandoObject> objList = new List<ExpandoObject>();
            foreach (DeviceCheckInfo info in list)
            {
                dynamic obj = new ExpandoObject();

                DeviceInfo deviceInfo = BLLFactory<Device>.Instance.FindByCode(info.DeviceCode);
                if (deviceInfo != null)
                {
                    obj.Dept = deviceInfo.Dept;
                    obj.Brand = deviceInfo.Brand;
                    obj.Name = deviceInfo.Name;
                    obj.Model = deviceInfo.Model;
                    obj.SerialNo = deviceInfo.SerialNo;
                }
                obj.ID = info.ID;
                obj.DeviceCode = info.DeviceCode;
                obj.OperateTime = info.OperateTime;
                obj.Operator = info.Operator;

                objList.Add(obj);
            }

            //Json格式的要求{total:22,rows:{}}
            //構造成Json的格式傳遞
            var result = new { total = pagerInfo.RecordCount, rows = objList };
            return ToJsonContentDate(result);
        }

2)介面的資料展示

上面定義了資料的獲取方式,也就是我們需要任何資料都可以在MVC控制器裡面,通過動態屬性的方式新增到集合物件裡面,從而簡化了我們介面的處理,我們只需要把獲得的資訊展示在介面上即可,非常簡便了。

介面檢視的HTML程式碼如下所示

            <table id="grid" class="table table-striped table-bordered table-hover" cellpadding="0" cellspacing="0" border="0" class="display" width="100%">
                <thead id="grid_head">
                    <tr>
                        <!--裝置編碼    所屬科室    品牌    品類    型號    裝置序列號    檢查時間    處理人    -->
                        <th class="table-checkbox" style="width:40px"><input class="group-checkable" type="checkbox" onclick="selectAll(this)"></th>
                         <th>裝置編碼</th>
                         <th>所屬科室</th>
                         <th>品牌</th>
                         <th>品類</th>
                         <th>型號</th>  
                        <th>裝置序列號</th>
                        <th>檢查時間</th>
                        <th>處理人</th>
                        <th style="width:90px">操作</th>
                    </tr>
                </thead>
                <tbody id="grid_body"></tbody>
            </table>

我們繫結到介面上,是通過Ajax的方式獲取資料,然後繫結顯示的,JS程式碼如下所示。

        function SearchCondition(page, condition) {
            //獲取Json物件集合,並生成資料顯示內容
            url = "/DeviceCheck/FindWithPager?page=" + page + "&rows=" + rows;
            $.getJSON(url + "&" + condition, function (data) {
                $("#totalCount").text(data.total);
                $("#totalPageCount").text(Math.ceil(data.total / rows));

                $("#grid_body").html("");

                //<!--裝置編碼    所屬科室    品牌    品類    型號    裝置序列號    檢查時間    處理人    -->
                $.each(data.rows, function (i, item) {
                    var tr = "<tr>";
                    tr += "<td><input class='checkboxes' type=\"checkbox\" name=\"checkbox\" value=" + item.ID + "></td>";
                     tr += "<td>" + item.DeviceCode + "</td>";
                     tr += "<td>" + item.Dept + "</td>";
                     tr += "<td>" + item.Brand + "</td>";
                     tr += "<td>" + item.Name + "</td>";
                     tr += "<td>" + item.Model + "</td>";
                     tr += "<td>" + item.SerialNo + "</td>";
                     tr += "<td>" + item.OperateTime + "</td>";
                     tr += "<td>" + item.Operator + "</td>";
  
                    tr += getActionHtml(item.ID); //獲取檢視、編輯、刪除操作程式碼

                    tr += "</tr>";
                    $("#grid_body").append(tr);
                });

                //設定分頁屬性及處理
                var element = $('#grid_paging');
                if(data.total > 0) {
                    var options = {
                        bootstrapMajorVersion: 3,
                        currentPage: page,
                        numberOfPages: rows,
                        totalPages: Math.ceil(data.total / rows),
                        onPageChanged: function (event, oldPage, newPage) {
                            SearchCondition(newPage, condition);  //頁面變化時觸發內容更新
                        }
                    }
                    element.bootstrapPaginator(options);
                } else {
                    element.html("");
                }
            });
        }

這樣就最終優雅的實現了我們前面介紹的介面效果了。

相關推薦

MVC控制器裡面使用dynamicExpandoObject實現資料轉義輸出

在很多時候,我們在資料庫裡面定義表字段和實際在頁面中展示的內容,往往是不太匹配的,頁面資料可能是多個表資料的綜合體,因此除了我們在表設計的時候考慮周到外,還需要考慮資料展現的處理。如果是常規的處理,那麼需要對部分外來鍵欄位進行特別的轉義處理,如果需要增加多一些欄位,那麼這種處理可能就相對比較麻煩一些。本文介紹

微信端調取相冊攝像頭實現圖片上傳並上傳到本地服務器

配置 epic 替換 pan source 工具 alert 調試 family 在微信公眾號網頁開發時,遇到了圖片上傳的問題,查看了微信的開發者文檔,裏面的資料比較全。接著我們看一下整個的流程 1、config權限配置 $.ajax({ url:‘wx_getC

android studio使用CMakeNDK實現應用自身被卸載時打開某一網址

licensed 項目 右鍵 ava 開發工具 not per 2.0 idt 實現應用自身被卸載時打開某一網址的c代碼 MyActivity: public class MyActivity extends Activity { /** * Calle

Eclipse + Msys + Boost 安裝配置實現語法高亮編譯

1. 環境安裝和配置 下載Ecllipse, 稍微老一點的版本在高亮C++11的語法會有一些問題,目前這個版本是可以的。Eclipse的具體安裝步驟不說了,略過。 下載Msys並安裝。Msys是目前最好的在Windows下開發GNU程式的環境之一,比Cy

mstsc儲存使用者名稱密碼實現自動登入遠端桌面

MSTSC引數說明 首先可以使用mstsc /?來檢視關於mstsc的引數說明 根據上述的命令說明,我這裡實現的bat檔案為 mstsc C:/a.rdp /console /v: xxx.xxx.xxx.xxx:3389   rdp檔案生成方法 最近由

1.4 開始第一幅“碼繪”——活用變數常量實現滑鼠互動

引言——如何在程式中改變繪製內容 回顧之前畫懵逼臉的程式碼,可以看出,每個語句中都是直接用數值精確指定橢圓/直線/色彩: 1 2 3 4 5 6 7 8 9 10

通過JSCSS實現網頁載入中的動畫效果

需要材料: 一張loading動畫的gif圖片 基本邏輯: 模態框遮罩 + loading.gif動圖, 預設隱藏模態框 頁面開始傳送Ajax請求資料時,顯示模態框 請求完成,隱藏模態框

在Android Studio上使用GSON+VOLLEY秒處理網路資料成集合。感受框架的力量。搭配RecyclerViewSwipeRefreshLayout實現底端載入更多下拉重新整理。

【致謝,引用,宣告,前言】 關於GSON和VOLLEY,我百度了很多資料,個人感覺有兩篇部落格介紹的特別好,附上鍊接咯:   GSON: http://blog.csdn.net/lk_blog/article/details/7685169  VOLLEY:http://

一個一維維陣列中只有1-1實現程式求和為0的最長子串長度並在註釋中給出時間空間複雜度

這是一個比動態規劃更簡單的解法。 思路就是在i從0到n,計算sum(i),sum(i)表示從0到i的元素之和。並儲存在字典dic中,value是索引i,在往後的遍歷中每得到一個sum(i)就檢視dic的keys是否已有此sum(i)值,如果有則用當前i位置減去儲存的i,並與

如何jpgpng混使用實現mask?

感謝QQ好友(快樂小冬瓜(Dony))的幫忙,問題解決了,解決方法在下面。同時本人剛入行半個月,希望能認識更多的朋友,歡迎加*****:346271116 CCImage *jpgImage = new CCImage();    jpgImage -> initWithImageFile("img/r

Java物件重寫toString()方法實現物件內容輸出

覆蓋父類toString()方法: public class Person { private String id; private String name; public Person(String id, String name) { this.id = id;

使用nodeexpress+mongodb實現資料增刪改功能

2018即將過去,2019即將來臨,前端技術不斷在在更新,學的東西越來越多。我們只有不斷的學習,才不能被淘汰。在前後端分離的一個時代,後端提供介面,前端呼叫介面,邏輯判斷,每個都是獨立的工作。如果自己在空餘的時間,想學習新的知識,卻沒有好的介面,只能寫寫假的json資料。或者網上開源的資料庫,mock,野狗資

java做伺服器android做客戶端實現資料傳輸

許久未動筆,有個小專案開始動工。 需要用一臺windows電腦做伺服器,在android端與其進行資料交換,實現一些業務。 簡單起見,用java寫這個伺服器,以前沒做過,試試水。很簡單的程式碼,純粹找思路。 伺服器端程式碼: package com.test; impor

利用ajax提交表單實現資料前端後臺資料互動的完整流程演示

該演示需要用到  1 : json.jar(下載)                               2 : jquery.js(下載) 流程演示:1.點選“登入”按鈕,傳參到後臺                     2.後臺獲取資料,處理分析資料,利用JSO

PHPCMS V9頻道頁迴圈子欄目內容(子欄目為單頁則輸出標題內容為列表則輸出欄目名稱分頁列表)

注意:頻道下的子欄目最多隻能有一個分頁列表欄目(否則分頁會有問題),單頁面不限。效果如下圖:頻道頁模板如下:<div class="prointro"> <?php $page = $

solr連線資料庫實現資料定時同步(個人專案經驗)

在專案開發過程中為了提高查詢效率和降低資料庫的壓力,因此此時就將查詢量大的資料放到solr中,查詢從solr中執行,不走資料庫,但是資料庫資料修改後怎麼辦呢,此時就要實現solr連線資料庫,實現資料的定時同步,保證資料的一致性。 solr的搭建看我另一篇部落格吧http:/

C++第三章(類物件)下篇 (動態建立與釋放物件的賦值複製靜態資料成員友元)

一,物件的動態建立與釋放 new (程式設計師怎麼會沒有朋友??? 來讓我給你new 一個) 在我學過的c中 我們一般都用 malloc 來動態申請空間。現在我們可以用new 來申請空間 Box *pt; pt = new Box; c++允許在new時進行賦值 Box *

使用NodeJs實現資料抓取

cb({"title":"如果他喜歡你,就不會曖昧不清;如果他不再聯絡你,別為他找理由","date":"2011-05-12","auth":"午夜未殤","content":"  1、如果他被動矜持。\r\n  \r\n  “也許他不想破壞我們的友誼”\r\n  \r\n  “也許他害羞”“也許他自卑”

連線資料庫的工具類實現資料的插入

一、建立連線資料庫的工具類 package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class DbUtil {

Flume, KafkaNiFi資料實時日誌資料收集、資料獲取技術哪家強?

作者Tony Siciliani  本文為36大資料獨譯,譯者:隨風 我們在建設一個大資料管道時,需要在Hadoop生態系統前仔細考慮,如何獲取大體量、多樣化以及高速性的資料。在決定採用何種工具以滿足我們的需求時,最初對於擴充套件性、可靠性、容錯性以及成本的考慮便發揮了作