asp.net mvc後臺操作之讀寫xml控制首頁動態頁面開關顯示

来源:http://www.cnblogs.com/zhouyuangan/archive/2016/10/04/aspnet_4.html
-Advertisement-
Play Games

在asp.net mvc項目里,用戶需要開拓幾個活動版面,並以側欄的方式呈現在首頁右側,幾個活動時間不一致,為避免瀏覽者在活動未開放之時進入未開放的服務頁面。因此不僅需要在活動代碼中加入限制功能,也需要在前臺取消不合時宜的頁面的展示。 ...


一、背景

  在asp.net mvc項目里,用戶需要開拓幾個活動版面,並以側欄的方式呈現在首頁右側,幾個活動時間不一致,為避免瀏覽者在活動未開放之時進入未開放的服務頁面。因此不僅需要在活動代碼中加入限制功能,也需要在前臺取消不合時宜的頁面的展示。後臺效果圖:

二、問題分析

  要想控制頁面開關顯示,就得有存儲開關信息的介質,將在後臺產生的操作記錄下來,併在瀏覽者載入首頁之時能讀取操作記錄並達到控制頁面開關的目的。因此,考慮兩種介質儲存開關記錄信息,一是用資料庫mysql,二是用xml。考慮到這對資料庫的功能大材小用,並且會增加首頁載入時對資料庫資源消耗,所以考慮使用xml文檔來記錄開關記錄才是兩者中較好的選擇。這裡需要我們做一下前期工作,先設計xml的結構:

  

<?xml version="1.0" encoding="gb2312"?>
<Settings>
  <Setting ID="1">
    <title>****</title>
    <status>true</status>
  </Setting>
</Settings>

  說明的是:ID是對應多個紀錄的setting區分標記,title是設置頁面的名字,也就是服務的名字,status表明當前的服務頁面的狀態,有兩個值:true or false。在項目里添加名為Xml的文件夾,並保存設計的XML的命名為ServiceSettings.xml。

三、解決思路或過程

  首先,產生開關操作需要頁面上的控制項,這裡使用的checkbox標簽,當然這不是唯一選擇,朋友們可以用其他的標簽來作為輸入控制項的使用。思路是:我觸擊checkbox,對應的js代碼記錄值,並以ajax上傳至後臺action中,後臺的action作出反應。

  js代碼:

 function BloodController() {
        $.ajax({
            type: "POST",
            url: "/Admin/Controller",
            data: {},
            dataType: "Json"
        });
    }

  html代碼:

<input name="switch-field-1" class="ace ace-switch ace-switch-6" type="checkbox" onclick="Controller()" />

  ajax中的data,在這裡不標出。觸發後臺action一次,那麼就會運行action中操作xml的代碼,那麼就會改變xml中記錄的值。

  然後,是action中操作xml的實現。思路是:首先要獲取xml在應用程式中的相對位置,然後便是更改xml的值。

 public string Xmlpath = HttpRuntime.AppDomainAppPath.ToString() + "/Xml/ServiceSettings.xml";
        
        public ActionResult Controller()
        {
            OperateXml sx = new OperateXml();
            sx.modifyXml(Xmlpath);
            return Json("");
        }

  說明的是:HttpRuntime.AppDomainAppPath.ToString();方法可以獲取當前應用程式所在的根目錄。為了操作多個xml文件,我寫了OperateXml一個類方法,這裡進入對xml的操作細節介紹。

  對於xml操作的原理不多說,其實ado.net支持的也很棒,xml文檔的結構類似於html,但它的自由度更高,可標記性也更高。不多說,直接上代碼,註釋里都解釋了:

public  void modifyXml(string Path)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(Path);
            XmlNodeList nodeList = xmlDoc.SelectSingleNode("Settings").ChildNodes;//獲取bookstore節點的所有子節點
            foreach (XmlNode xn in nodeList)//遍歷所有子節點
            {
                XmlElement xe = (XmlElement)xn;//將子節點類型轉換為XmlElement類型
                if (xe.GetAttribute("ID") == "1")
                {
                    XmlNodeList nls = xe.ChildNodes;//繼續獲取xe子節點的所有子節點
                    foreach (XmlNode xn1 in nls)//遍歷
                    {
                        XmlElement xe2 = (XmlElement)xn1;//轉換類型
                        if (xe2.Name == "status")//如果找到
                        {
                            if (xe2.InnerText != "false")
                            {
                                xe2.InnerText = "false";//則修改
                                break;//找到退出來就可以了    
                            }
                            else if (xe2.InnerText == "false")
                            {
                                xe2.InnerText = "true";//則修改
                                break;//找到退出來就可以了    
                            }
                        }
                    }
                    break;
                }
            }
            xmlDoc.Save(Path);//保存。
        }

  因為代碼註釋里解釋得夠清晰了,這裡不做贅述,需要說明一點是:這裡的status只有兩個值:true or false;在前臺讀出的便是這兩個值,來進行頁面控制的。

  接著,就是前臺的讀取xml里的值。思路是:在動態頁面里讀取xml值,然後做判斷,true則顯示頁面,false則不顯示頁面。這裡讀xml代碼貼出,註釋里解釋詳細了。需要說明的是:這裡為了控制多個頁面的顯示,用了List<string>來轉載多個status的值。

public List<string> getAllXml(string Path)
        {
            string status = "";
            XmlDocument doc = new XmlDocument();
            doc.Load(Path);
            XmlNode xn = doc.SelectSingleNode("Settings");
            XmlNodeList xnl = null;
            xnl = xn.SelectNodes("/Settings/Setting/status");
            List<string> list = new List<string>();
            foreach (XmlNode xn1 in xnl)
            {
                status = xn1.InnerText;
                list.Add(status);
            }
            return list;
        }

需要說明的是:這裡為了控制多個頁面的顯示,用了List<string>來轉載多個status的值。在前臺頁面里頁面里就這樣實現:

@using TheOne.Tool
@{
    OperateXml sx = new OperateXml();
    List<string> list = new List<string>();    
    string path = HttpRuntime.AppDomainAppPath.ToString() + "/Xml/QuickServiceSettings.xml";
    list = sx.getAllXml(path);
    string status_Umbrella = list[0].ToString();
    //string status_Bottle = list[1].ToString();
    //string status_Older = list[2].ToString();
    //string status_Blood = list[3].ToString();
}
@if (status_Umbrella == "true")
{
    <div class="blog-grids wow fadeInDown" data-wow-duration=".8s" data-wow-delay=".2s">
        <div class="blog-grid-left">
            <a href="/UmbrellaManage/CreateUmbrellaUser"><img src="/Content/FrontEnd/images/yusan_2.jpg" class="img-responsive" alt=""></a>
        </div>
        <div class="blog-grid-right">
            <h5><a href="/UmbrellaManage/CreateUmbrellaUser">借用雨傘</a> </h5>
        </div>
        <div class="clearfix"> </div>
    </div>

}
else if (status_Umbrella == "false")
{

}

  到這裡,使用xml控制頁面開關介紹基本結束。

四、總結

  思路中最核心的便是對xml的操作,修改xml和讀取xml。而對於如何實現checkbox狀態切換,這個實現可以使用js來操作,讀出status值,並讓相應的js代碼控制checkbox的狀態是選中還是未選中。實際項目演示地址:點擊 南農工紅會

  如果我思路和方法有誤,懇請各位指正,虛心求教。轉載請註明來源與出處,謝謝合作 By 點將台無將


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一次寫博客,想不到寫什麼好b( ̄▽ ̄)d ,考慮的半天決定從sqlhelper開始,sqlhelper對程式員來說就像helloworld一樣,很簡單卻又很重要,helloworld代表著程式員萌新第一次寫代碼,而sqlhelper則是初次接觸資料庫(不知道這種說法對不對)。 好了不廢話了,下麵直 ...
  • 我們都知道ORM全稱叫做Object Relationship Mapper,也就是可以用object來map我們的db。 而且市面上的orm框架有很多,有重量級的Entity Framework,有輕量級的Dapper、PetaPoco等 假如你喜歡原生的Sql語句、又喜歡ORM的簡單、... ...
  • 一、背景 在之前做的小項目里有一需求是:要求將一活動錄入的數據進行統計,並以excel表格形式導出來,並且對錶格格式要求並不高。 二、問題分析 鑒於用戶只要求最終將資料庫中的數據導出excel,對於格式要求不高,因此只需要在頁面上加入一條鏈接,後臺action中讀取數據然後通過第三方組件導出,再下載 ...
  • 本人最近想做個桌面應用,參考了一下時下流行的各個軟體,發現大部分軟體的標題欄都是自定義的,甚至沒有標題欄,整個視窗為一個整體。 從整體感來說,預設的標題欄非常的破壞軟體風格的一致性,尤其是設置背景圖時,標題欄的顏色會顯得很礙眼。 所以,找了一些大神分享的技術貼,也同時給大家分享下我的心得。 參考鏈接 ...
  • 這篇文章主要講述 IIS 8 部署免費 HTTPS 。 HTTPS 是互聯網 web 大勢所趨。TaSaid 最近把機房從香港遷移到青島,趁著這次機會,觀望並折騰了幾天,在遷移中順便完成了 HTTPS 的部署。 ...
  • 剛接到這樣的任務時,沒有感覺到任何壓力,不就是給移動端應用提供數據嗎?那邊發來參數,這邊處理數據,返回JSON。做網站開發時經常使用ajax請求後臺數據,不就是這麼回事嗎。於是,在確認完需求後就開始幹了,很快,進入聯調階段,這個時候各種問題來了,忙得不可開交。吃一塹,長一智,項目結束後總結了下,大致 ...
  • 虛方法和抽象方法都可以供派生類重寫,它們之間有什麼區別呢? 1. 虛方法必須有實現部分,併為派生類提供了覆蓋該方法的選項 抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,否則派生類將不能被實例化。如: //抽象方法 public abstract class Animal { publ ...
  • 一、獲取文件夾列表 /// /// 獲取文件夾下的文件列表 /// /// string Path:文件夾路徑(@"C:\") /// string SearchPattern:擴展名過濾(" .txt") /// bool SearchChild:為False不搜索子目錄,為True搜索子目錄 / ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...