在MVC控制器里面使用dynamic和ExpandoObject嫉柴,實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)義的輸出

在很多時候计螺,我們在數(shù)據(jù)庫里面定義表字段和實(shí)際在頁面中展示的內(nèi)容登馒,往往是不太匹配的,頁面數(shù)據(jù)可能是多個表數(shù)據(jù)的綜合體圈纺,因此除了我們在表設(shè)計(jì)的時候考慮周到外蛾娶,還需要考慮數(shù)據(jù)展現(xiàn)的處理法褥。如果是常規(guī)的處理半等,那么需要對部分外鍵字段進(jìn)行特別的轉(zhuǎn)義處理,如果需要增加多一些字段莽囤,那么這種處理可能就相對比較麻煩一些朽缎。本文介紹如何在MVC控制器里面使用dynamic和ExpandoObject话肖,實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)義后一體化的輸出葡幸,包括增加任意多的字段信息蔚叨。
1、數(shù)據(jù)信息的展示
一般情況下邢锯,我們在界面里面展示的信息是相對比較豐富的丹擎,盡管我們設(shè)計(jì)數(shù)據(jù)表的時候领曼,考慮的是如何精簡且避免重復(fù),但是在界面上展示的信息毁渗,往往是考慮如何讓用戶更加方便,因此可能盡可能的展示相關(guān)信息府适。
如對于這樣的場景檐春,設(shè)備信息作為主要的基礎(chǔ)信息疟暖,其相關(guān)的業(yè)務(wù)包括設(shè)備檢查田柔、設(shè)備維護(hù)硬爆、設(shè)備報(bào)修等信息,如下所示缘圈。


基于上面的數(shù)據(jù)設(shè)計(jì)糟把,我們?nèi)绻谡故驹O(shè)備檢查糊饱、設(shè)備維護(hù)颠黎、設(shè)備報(bào)修等信息的時候狭归,那么我們一般還需要展示部分的設(shè)備基礎(chǔ)信息过椎,這樣我們更容易了解整個記錄數(shù)據(jù)疚宇,但是我們在數(shù)據(jù)設(shè)計(jì)的時候,是把它們分開的间涵,因此需要在輸出到界面的時候榜揖,把它們綜合起來举哟。
我以前在《基于MVC4+EasyUI的Web開發(fā)框架經(jīng)驗(yàn)總結(jié)(9)--在Datagrid里面實(shí)現(xiàn)外鍵字段的轉(zhuǎn)義操作》介紹過一些數(shù)據(jù)轉(zhuǎn)義的處理,不過那種方式并不是比較理想的方式潜叛。本篇介紹的使用dynamic和ExpandoObject才是我理想的處理模式威兜。
我們來看看我最終通過這種方式實(shí)現(xiàn)的界面效果牡属,之后我們再來一步步介紹如何實(shí)現(xiàn)這個操作過程的扼睬。

2窗宇、數(shù)據(jù)轉(zhuǎn)義的實(shí)現(xiàn)
在上面的界面效果里面军俊,我們是基于MVC實(shí)現(xiàn)后臺的處理,在界面上利用Bootstrap進(jìn)行展示的(利用EaysUI組件也是類似的處理)担败。我們分為兩部分進(jìn)行介紹實(shí)現(xiàn)的提前,一部分是采用MVC的輸出數(shù)據(jù)泳唠,一部分是界面的展示。
1)MVC的控制器數(shù)據(jù)處理
在MVC里面勇垛,我們一般通過基類的FindWithPager進(jìn)行數(shù)據(jù)的分頁處理士鸥,基于如何在MVC控制器里面實(shí)現(xiàn)數(shù)據(jù)的分頁處理础淤,大家感興趣可以參考《基于Metronic的Bootstrap開發(fā)框架經(jīng)驗(yàn)總結(jié)(2)--列表分頁處理和插件JSTree的使用》隨筆進(jìn)行了解。
常規(guī)的做法币砂,如果是主表信息决摧,我們可以把它們簡單的輸出掌桩,如下所示姑食。

public override ActionResult FindWithPager()
{
    //檢查用戶是否有權(quán)限音半,否則拋出MyDenyAccessException異常
    base.CheckAuthorized(AuthorizeKey.ListKey);

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

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

也就是不需要經(jīng)過任何轉(zhuǎn)義就直接把查詢到的數(shù)據(jù)列表輸出給調(diào)用者曹鸠,由界面進(jìn)行數(shù)據(jù)的篩選處理。
如果對于上面提到的設(shè)備檢查坛善、設(shè)備維修等和設(shè)備信息相關(guān)的眠屎,我們就需要利用dynamic和ExpandoObject肆饶,把設(shè)備信息整合一起提供給界面了,具體代碼如下所示。
我們首先對查詢的記錄進(jìn)行遍歷阿宅,把每條記錄進(jìn)行轉(zhuǎn)換,如下所示蛉鹿。

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

注意上面我們定義了List<ExpandoObject>的列表和dynamic obj的對象妖异,這樣我們通過動態(tài)定義的對象他膳,把我們需要的字段屬性加到動態(tài)對象里面绒窑,然后放到集合里面即可些膨。
完整的分頁控制器代碼如下所示。

public override ActionResult FindWithPager()
{
    //檢查用戶是否有權(quán)限肢预,否則拋出MyDenyAccessException異常
    base.CheckAuthorized(AuthorizeKey.ListKey);

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

    //設(shè)備編碼    所屬科室    品牌    品類    型號    設(shè)備序列號    檢查時間    處理人
    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:{}}
    //構(gòu)造成Json的格式傳遞
    var result = new { total = pagerInfo.RecordCount, rows = objList };
    return ToJsonContentDate(result);
}

2)界面的數(shù)據(jù)展示
上面定義了數(shù)據(jù)的獲取方式烫映,也就是我們需要任何數(shù)據(jù)都可以在MVC控制器里面窑邦,通過動態(tài)屬性的方式添加到集合對象里面冈钦,從而簡化了我們界面的處理瞧筛,我們只需要把獲得的信息展示在界面上即可导盅,非常簡便了。
界面視圖的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>
            <!--設(shè)備編碼    所屬科室    品牌    品類    型號    設(shè)備序列號    檢查時間    處理人    -->
            <th class="table-checkbox" style="width:40px"><input class="group-checkable" type="checkbox" onclick="selectAll(this)"></th>
             <th>設(shè)備編碼</th>
             <th>所屬科室</th>
             <th>品牌</th>
             <th>品類</th>
             <th>型號</th>  
            <th>設(shè)備序列號</th>
            <th>檢查時間</th>
            <th>處理人</th>
            <th style="width:90px">操作</th>
        </tr>
    </thead>
    <tbody id="grid_body"></tbody>
</table>

我們綁定到界面上绢片,是通過Ajax的方式獲取數(shù)據(jù)岛琼,然后綁定顯示的槐瑞,JS代碼如下所示。

function SearchCondition(page, condition) {
    //獲取Json對象集合祠挫,并生成數(shù)據(jù)顯示內(nèi)容
    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("");

        //<!--設(shè)備編碼    所屬科室    品牌    品類    型號    設(shè)備序列號    檢查時間    處理人    -->
        $.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);
        });

        //設(shè)置分頁屬性及處理
        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);  //頁面變化時觸發(fā)內(nèi)容更新
                }
            }
            element.bootstrapPaginator(options);
        } else {
            element.html("");
        }
    });
}

這樣就最終優(yōu)雅的實(shí)現(xiàn)了我們前面介紹的界面效果了涤浇。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末只锭,一起剝皮案震驚了整個濱河市蜻展,隨后出現(xiàn)的幾起案子邀摆,更是在濱河造成了極大的恐慌,老刑警劉巖施逾,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汉额,死亡現(xiàn)場離奇詭異榨汤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妓灌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門虫埂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人告丢,你說我怎么就攤上這事岖免÷妫” “怎么了栗精?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鹿寨。 經(jīng)常有香客問我脚草,道長原献,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任写隶,我火速辦了婚禮慕趴,結(jié)果婚禮上叮盘,老公的妹妹穿的比我還像新娘。我一直安慰自己毒费,他們只是感情好愈魏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溪厘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侧甫。 梳的紋絲不亂的頭發(fā)上蹋宦,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天守屉,我揣著相機(jī)與錄音蒿辙,去河邊找鬼。 笑死思灌,一個胖子當(dāng)著我的面吹牛习瑰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柠横,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牍氛,長吁一口氣:“原來是場噩夢啊……” “哼烟阐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜒茄,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤檀葛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后空扎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旭贬,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尤误,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砌溺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡弟胀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萧朝,到底是詐尸還是另有隱情,我是刑警寧澤检柬,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布何址,位于F島的核電站用爪,受9級特大地震影響胁镐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颇玷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一帖渠、第九天 我趴在偏房一處隱蔽的房頂上張望阿弃。 院中可真熱鬧诊霹,春花似錦脾还、人聲如沸入愧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至终畅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杖狼,已是汗流浹背蝶涩。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工绿聘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留次舌,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓鲜屏,卻偏偏與公主長得像国拇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子也殖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容