Dnn模組開發步驟雜談

來源:互聯網
上載者:User
 我是最近才開始學習dnn的,接到的第一個任務就是開發dnn的模組。最近有朋友問我開發的步驟,我想還是把它寫在blog上,一方面為了共用資源,一方面是希望能夠得到dnn開發高手的指點。

在模組的開發上,我採用的方案:
介面層和代碼層完全分開。

至於採用這個方案,對我來說並不是偶然的,因為我之前從來沒有做過asp或是asp.net的開發,所以我對asp.net的介面展示層不感興趣。所以我將模組的執行代碼放到了另外一個工程中。不過這一點還是要得益於asp.net的架構,如果是在asp下面,這種開發模式是不可能的。

由於我的文字功底很差勁,所以,有表達不清楚的地方,大家可以用qq,msn或是email交流。

首先,開啟工程模板,建立建一個dnn網站(圖1),說明一下,由於我示範的是一個已經建好的dnn網站,所以多了一個DesktopModules檔案夾,在最開始建立網站的時候,這個檔案夾是不存在的,這個檔案夾就是用來存放DNN Module的檔案夾。

圖1

然後,通過工程嚮導,添加Dnn模組,在這裡,我選擇的是C#,因為我個人比較喜歡用C#。在這裡我建立一個Request模組圖2

圖2

當模組添加之後,你要將模組所在的檔案夾名稱改為模組名稱,即將ModuleName改為Request。圖3

圖3

在這裡一個模組的添加就算完成了,但是如果要將模組的執行代碼放到另外一個工程中,我們還要做一些工作。

在這裡,我另外建立一個class library工程,叫做HGG.Request。我這樣命名只是為了專案管理,在技術上沒有其它什麼意思。圖4,圖5,由於顯示的原因,我把圖片分成了兩截。

圖4


圖5

大家可以發現,每個頁面對應的cs檔案被移到了HGG.Request工程中,除此之外,還有資料處理檔案也被移動到了這個裡面。

那麼這兩個工程是如何關聯起來的呢,以EditRequest.aspx檔案為例,在最初由工程嚮導產生這個檔案的時候,代碼是這樣的:
<%@ Control language="C#" Inherits="YourCompany.Modules.Request.EditRequest" CodeFile="EditRequest.ascx.cs" AutoEventWireup="true"%>

而當我把執行代碼放到HGG.Request工程中後,我必須對上面的這段代碼做如下調整:
<%@ Control Language="C#" Inherits="HGG.Modules.Request.EditRequest" AutoEventWireup="false"
    Explicit="True" %>

最關鍵的變化是刪除了CodeFile設定,修改了Inherits設定。簡單的說,HGG.Modules.Request.EditRequest就是在HGG.Request工程中,處理EditRequest.aspx的類,這個類名稱叫EditRequest,名稱空間為HGG.Modules.Request。

做完了上面的這一步,我們基本上就完成了表現層和代碼層的分離工作。下面的問題是這兩層如何通訊。

關於這一點,asp.net做得非常的強,.net架構上有動態事件綁定,這樣的技術在asp.net中同樣有效。

例如,在Request.aspx上有一個button:
<div style="float: left;">
                <asp:LinkButton ID="PreviousLink" runat="server" Text="Previous" CssClass="Normal" />
</div>
如果我們要處理它被點擊後的事件,那麼在HGG.Request工程中的Request.cs檔案中,我們要做以下事情
1、在頁面載入時,定義事件綁定:
//聲明事件綁定
private void RegisterEvents()
        {
            SearchButton.Click += new EventHandler(SearchButton_Click);
            PreviousLink.Click += new EventHandler(PreviousLink_Click);
            NextLink.Click += new EventHandler(NextLink_Click);
            this.Load += new EventHandler(EditRequest_Load);
        }
//定義事件的處理代碼
 private void PreviousLink_Click(object sender, EventArgs e)
        {
            MovePage(SegmentData, false);
        }

在這裡,PreviousLink在這個類中,是一個屬性,我通過這個屬性來擷取Request.aspx上PreviousLink的引用,在這裡,HGG.Request中的Request類就和Dnn網站上的Request.aspx聯絡起來了。那麼這個屬性是如何定義的呢?下面是它的代碼:
private LinkButton PreviousLink
        {
            get
            {
                return (LinkButton)FindControl("PreviousLink");
            }
        }
這就是關鍵。

其它的我想我這裡就不必多說了,幾乎一般的windows類庫開發模式一樣。

好了,這篇文章在這裡就結束了,希望我說清楚了,不清楚的地方,歡迎討論。
(最近我也在學習做dnn的皮膚)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.