• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    ASP.NET Jumpstart:構建應用程序和網頁框架

    發布: 2007-6-11 12:49 | 作者: 網絡轉載 | 來源: 網絡 | 查看: 200次 | 進入軟件測試論壇討論

    領測軟件測試網  

    摘要:學習如何使用 Microsoft ASP.NET 和 Microsoft Visual Studio 2005(或 Microsoft Visual Web Developer 2005 Express Edition)構建自己的初學者工具包。本文是 ASP.NET Jumpstart 系列文章中的第三篇。

    單擊此處可下載本文的代碼示例。

    簡介

    歡迎您閱讀第三篇 ASP.NET Jumpstart 文章,該系列的四篇文章將從頭至尾引領您創建一個完整的應用程序。該系列的第一篇文章介紹了完整的初學者工具包,向您展示如何安裝和運行該應用程序。第二篇文章討論如何構建應用程序的數據層,以及如何理解 ASP.NET 頁面上的數據源控件與初學者工具包中底層數據的交互原理。第三篇文章將繼續幫助您了解如何構建該應用程序的表示層 — 通過研究應用程序和網頁框架(自始至終使用的)的創建過程而實現。

    正在構建的初學者工具包名為 Media Share Library Starter Kit。通過它創建一個允許注冊用戶表示其媒體項目集合(例如,電影 DVD、音樂 CD、書籍等)的應用程序很容易,以便供其他注冊用戶借用。用戶可以集中瀏覽使用該應用程序的組所持有的項目庫,并向項目的注冊所有者請求借用指定的項目。Media Share Library Starter Kit 的概念為您提供一個快速組織庫集合的框架,以便該庫集合可以在更多的人之間共享。

    正如前幾篇文章所闡述的那樣,無論是否使用初學者工具包,它本身就說明了 ASP.NET 在這一最新的版本的 ASP.NET 2.0 中所具有的一些更為激動人心的附加功能,這正是其微妙之處。初學者工具包廣泛使用母版頁、新的代碼隱藏模型、新服務器控件以及其他功能。但是,本文的重點是有關它使用的一些令人振奮、新的 ASP.NET 基本功能(例如,母版頁的使用),以及應用程序頁面中主題和導航的使用,在 ASP.NET 2.0 中可以找到這些功能。

    讓我們開始自己動手構建初學者工具包的框架吧,首先來使用 ASP.NET 2.0 的母版頁功能。

    使用貫穿應用程序的網頁模板

    ASP.NET 2.0 加入了母版頁,這是令人更為振奮的附加功能之一。母版頁提供的基本功能是創建一個應用程序自始至終所使用的網頁模板。大多數個體用戶不會構建各自應用程序的所有頁面,因為應用程序之間的差異太大了。因此,您會發現頁與頁之間存在很多相同的應用程序頁面元素。例如,大多數頁面看起來都包含一個標題、導航提要欄以及某類頁腳。如果使用一個模板構建應用程序,您可以將這些公共元素放置到模板中,那么就無需在開發應用程序的每個頁面時不厭其煩地將這些項目重新編寫到程序中。此外,如果需要在使用模板時更改這些公共元素,那么只需更改一次,就可以一勞永逸地在整個應用程序中反映出來。

    構建母版頁 — MediaLibraryMain.master

    這樣看來,模板確實很有用,但是如何在 ASP.NET 2.0 中創建它呢?創建母版頁與創建標準的 .aspx 頁一樣簡單。您可以通過“New File”對話框來實現。Media Share Library Starter Kit 的母版頁命名為 MediaLibraryMain.master(請注意這里的母版頁使用 .master 代替標準的 .aspx 文件擴展名)。

    MediaLibraryMain.master 頁面頂部具有如程序清單 1 所示的下列頁面指令。

    程序清單 1. @Master 頁面指令

    <%@ Master Language="VB" CodeFile="MediaLibraryMain.master.vb" Inherits="MediaLibraryMain" %> 
    

    想必您也看到了,@Master 指令與 @Page 指令之間并沒有太大差別。還有很多屬性都是一樣的。

    如果瀏覽 Microsoft Visual Studio 中的 MediaLibraryMain.master 頁,可看到如圖 1 所示的“Design”視圖。


     

    圖 1. 在“Design”視圖中瀏覽媒體共享庫 (Media Share Libaray) 的母版頁

     

    仔細觀察該圖片,您會發現媒體共享庫的母版頁是十分簡單的。實際上,頁面上只有幾個控件。這些就是我們希望在應用程序所有頁面上出現的控件和元素。其中有標題、導航、登錄到應用程序的幾個鏈接、一個 SiteMapDataSource 控件以及最為重要的 ContentPlaceHolder 控件。

    SiteMapDataSource 控件(位于母版頁底部,因此無法在圖 1 中看到)只需放置在可以與 Web.sitemap 文件進行交互的頁面上,該文件是應用程序所包含的文件。連接該 .sitemap 文件的 Menu 控件用于顯示應用程序的導航。本文稍后將討論該導航系統。

    ContentPlaceHolder 控件位于母版頁的某個特定區域,它可以聲明任何繼承的內容頁放置頁面數據和信息的位置。除了各個 ContentPlaceHolder 控件(因為可以有多個)之外,頁面上包含的所有內容都認為是網頁模板的一部分。

    最后真正需要關注的就是母版頁上的 LoginView 控件。它是綁定到應用程序成員身份和角色管理系統上的控件。LoginView 控件可以為最終用戶顯示幾個不同的視圖或多組數據。匿名用戶(訪問應用程序但是還沒提供憑據的用戶)、經過身份驗證的用戶(以某種方式登錄到應用程序的用戶),以及一些權限更高的用戶(這類用戶不僅通過了身份驗證,還屬于某個特定應用程序角色,例如管理員角色)分別有一個視圖。讓我們看一下 MediaLibraryMain.master 頁上使用的 LoginView。程序清單 2 對此作出了說明。

    程序清單 2. 瀏覽 LoginView 服務器控件

    <asp:LoginView ID="LoginView1" runat="server">
       <AnonymousTemplate>
           <asp:LoginStatus ID="LoginStatus1" runat="server" />
          <br />
           <asp:HyperLink ID="HyperLink1" runat="server" 
             NavigateUrl="Join.aspx" Text="Join Today!"></asp:HyperLink>
       </AnonymousTemplate>
       <LoggedInTemplate>
           <asp:LoginStatus ID="LoginStatus1" runat="server" />
       </LoggedInTemplate>
    </asp:LoginView> 
    

    在本例中,匿名用戶和已經登錄到應用程序的用戶分別有一個視圖。這兩個視圖唯一的差別就在于是否存在指向 Join.aspx 頁的超鏈接,該鏈接是顯示給匿名用戶的,單擊這些鏈接就可以根據興趣加入應用程序。除此之外,兩個視圖都會顯示一個 LoginStatus 控件,該控件將為匿名用戶顯示一個登錄超鏈接,而為已經登錄的用戶顯示一個注銷超鏈接。下一步,我們將介紹如何使用該母版頁。

    繼承母版頁 — 創建內容頁

    雖然母版頁已準備就緒,但它不能在瀏覽器中調用。使用母版頁的意圖是利用其中定義的網頁模板創建一個內容頁。

    為了完成這項任務,首先要創建在應用程序根目錄中可見的 Default.aspx 頁。在 Visual Studio 中,右鍵單擊解決方案資源管理器中的項目,選擇所供菜單中的 Add New Item。此操作將啟動“添加新項目”對話框。選擇該對話框中的 Web Form。然后,您將看到用于創建該頁面的若干選項。該對話框如圖 2 所示。


     

    圖 2. 構建一個內容頁

    在該對話框中,要選擇的比較重要的兩個項目有:是否將業務邏輯放在代碼隱藏文件 (Default.aspx.vb) 中,以及是否使用母版頁。Media Share Library Starter Kit 在整個應用程序使用過程中都要利用代碼隱藏文件,不過,所有業務邏輯代碼都可以輕松地內嵌在構建的初學者工具包中。

    如果要將 Default.aspx 頁轉變為內容頁,必須確保選中了對話框中的 Select master page 選項。執行該操作后,會出現一個新的對話框,該對話框允許您選擇要使用的母版頁(可在應用程序中擁有多個母版頁)。圖 3 顯示的是后一個對話框。


     

    圖 3. 選擇合適的母版頁

    選好母版頁后,單擊 OK 按鈕,將創建 Default.aspx 頁。在外觀上,它與您或許已經習慣的標準 .aspx 頁略有不同。首先,檢查該內容頁的 @Page 指令。如程序清單 3 所示。

    程序清單 3. 內容頁的 @Page 指令

    <%@ Page Language="VB" MasterPageFile="~/MediaLibraryMain.master" 
        AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" 
        Title="Media Share Library" Theme="Evjen" %>
    

    該指令看起來相當標準,唯一可辨別的差異是該內容頁使用 MasterPageFile 屬性。屬性值必須指向您希望使用的母版頁位置。

    除此之外,另一個需要注意的重要屬性是 Title 屬性。在母版頁所包含的 <title> HTML 元素之間的確可以聲明頁面的標題目錄,但是通過 Title 屬性在 @Page 指令中直接定義頁面標題還可以覆蓋之前的設置。

    最后要討論的屬性是 Theme 屬性,它與母版頁無關。ASP.NET 2.0 網頁可以并入一個稱為主題 的中央托管類型系統。該屬性僅指向為生成該頁而引用的主題名。本文稍后將討論主題這一內容。

    真正將該 Default.aspx 頁轉變為內容頁的項目,除了 @Page 指令之外還有 @Page 指令聲明后面可見的所有內容。程序清單 4 顯示該內容。

    程序清單 4. 內容頁的其余部分

    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" 
     Runat="Server">
       <fieldset>
       Welcome to the Media Share Library 
       </fieldset>
    </asp:Content>
    

    母版頁上每包含一個 ContentPlaceHolder 服務器控件,在繼承母版頁的 ASP.NET 頁面上就應該有一個對應的 Content 服務器控件,但這不是必須的。舉例來說,如果 MediaLibraryMain.master 頁上有一個 ContentPlaceHolder 控件(其 ID 是 ContentPlaceHolder1),那么為了在定義的此區域中放置內容,使用該母版頁的所有頁面都需要加入一個指向該 ContentPlaceHolder 控件的 Content 服務器控件。

    Default.aspx 正是由于該原因而使用了該母版頁:您會發現頁面上包含程序清單 4 所示的 Content 控件。該控件的一個重要屬性是 ContentPlaceHolderID 屬性,它指向母版頁上所使用的 ContentPlaceHolder 控件的 ID 值(仍然是 ContentPlaceHolder1)。

    在頁面上設置好 Content 控件后,只需將所有希望在母版頁定義區域中出現的服務器控件或 HTML 放在 Content 控件的開頭和結尾元素之間即可。不允許將服務器控件或 HTML 元素放在該控件的外部,這將導致頁面引發一個錯誤。

    還要記住,不要將開頭和結尾 HTML 頁面元素放在您使用的 Content 控件中,因為這些元素在母版頁中已經進行了定義(例如 <html>、<head><body> 等元素)。

    構建導航系統

    要構建 Media Share Library Starter Kit 的應用程序框架,下一步是構建應用程序的導航系統。正如上文針對初學者工具包中母版頁的使用所討論的那樣,將 Menu 服務器控件綁定到應用程序的導航系統是為了能夠顯示給最終用戶。圖 4 顯示綁定到導航系統后的 Menu 控件。


     

    圖 4. 綁定到應用程序導航系統的“Menu”服務器控件

    那么,該信息存儲在什么位置呢?這個問題問得好,事實上激動人心的部分就在于此!ASP.NET 2.0 為您提供了一種在中央位置存儲整個應用程序導航信息的方法。在此之前,許多 Web 開發人員會將導航結構放在應用程序的各個頁面上,通常的做法就是將導航代碼從一個頁面復制-粘貼到另一個頁面上。您應該可以想象,在這種情況下如果要創建一個大型 Web 應用程序的導航系統,將需要多大規模的更改!同樣,不難想象這樣的應用程序在實際應用中又是多么容易出現問題!

    如果開發人員可以集中宿主導航設置,那么在真正發生更改時,只需在一個位置作出修改,就可以立即在使用該系統應用程序的每個頁面上反映出來。

    Media Share Library Starter Kit 確實利用了 ASP.NET 2.0 站點導航系統。默認情況下,這都是由 XML 文件 Web.sitemap 驅動的。程序清單 5 對此文件作出說明。

    程序清單 5. 應用程序的 Web.sitemap 文件

    該 XML 文件包含的內容并不多。不難看出,它非常簡單。Web.sitemap 文件由 元素組成,這些元素的嵌套關系決定了應用程序的導航結構。該文檔中只能定義一個根頁面(本例中為主頁 Default.aspx)。該主頁之上的其余嵌套鏈接都指向主庫中的網頁以及為站點管理員所使用的一個網頁。

    創建好該 XML 文件后,就可以在應用程序中使用它了。通過在需要使用這些導航數據的頁面上放置一個 SiteMapDataSource 控件就可以實現。如前文所述,在本文示例中放置該控件的唯一位置就是母版頁。該初學者工具包的母版頁MediaLibraryMain.master 就含有該數據源控件。將數據源控件綁定到 Web.sitemap 文件無需手動添加任何具體屬性。相反,SiteMapDataSource 控件會代表您自動綁定到該 XML 文件。

    設置好 SiteMapDataSource 控件后,通過 DataSourceID 屬性使用 Menu 服務器控件來顯示應用程序的導航系統就顯得相當簡單了,如程序清單 6 所示。

    程序清單 6. 將“Menu”服務器控件綁定到 SiteMapDataSource 控件

    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
        <siteMapNode url="~/Default.aspx" title="Home" description="">
            <siteMapNode url="~/Library/Default.aspx" 
             title="Alerts & Info" description="" />
            <siteMapNode url="~/Library/MainLibrary.aspx" 
             title="Main Library" description="" />
            <siteMapNode url="~/Library/MyLibrary.aspx" 
             title="My Library" description="" />
            <siteMapNode url="~/Library/EnterMedia.aspx" 
             title="Enter New Media" description="" />
            <siteMapNode url="~/Admin/Default.aspx" 
             title="Admin" description="" />
        </siteMapNode>
    </siteMap>
    

    只要將頁面上 SiteMapDataSource 控件(默認值是 SiteMapDataSource1)的 ID 賦值給 DataSourceID 屬性,就可以將該控件與 SiteMapDataSource 控件所提供的結果綁定到一起。

    限制對應用程序各部分的訪問

    您總是想要構建具有受限訪問點的 Web 應用程序。該初學者工具包與這樣的應用程序毫無差別!癓ibrary”文件夾的所有內容只能供注冊用戶查看和使用。同樣,“Admin”文件夾的內容則只能供加入管理員角色的注冊用戶所使用。

    ASP.NET 2.0 包含的成員身份和角色管理系統可以勝任這些任務。這些系統可以管理應用程序的身份驗證/授權過程,而且允許您將特定用戶設置為自定義的角色。

    下面,我們來了解如何設置一個管理這些任務的系統。

    嵌套的 Web.config 文件

    要建立這種類型的系統,首先要做的是在您的應用程序中放入一個正確的 Web.config 文件。將該文件放在應用程序的根部可以控制許多具有不同特征的應用程序行為,這一點您可能再清楚不過了。

    相對來說,這一點不假,但是事實上 Web.config 文件是一個覆蓋文件,它實際上用于覆蓋建立好的設置和行為,在服務器的 machine.config 文件中已經對其進行了設置。machine.config 文件控制著服務器內駐留的每個單獨應用程序的設置和行為。要覆蓋該文件中保存的設置,只要在應用程序的根部放置一個 Web.config 文件即可。這樣做允許您在該文件中加入更多特定于應用程序的設置。

    然而,在 Media Share Library Starter Kit 中,需要應用僅特定于某個應用程序具體目錄的設置。實際上這樣的設置有兩處 — 一是“Library”目錄,另一處是“Admin”目錄。我們先來了解針對該初學者工具包不同目錄的特殊規則,然后再來了解如何應用這些設置:

    根目錄中只包含一個 Web.config 文件,該文件為訪問此站點的匿名用戶提供了開放式的訪問。此處建立的規則將級聯到應用程序的其他各級子目錄,只要目錄內駐留的 Web.config 文件沒有明確地覆蓋這些規則,就一直有效。
    初學者工具包的“Library”目錄中有一個 Web.config 文件,該文件對其中包含的每個文件和目錄應用指定的設置。該庫目錄內容僅供經過身份驗證的用戶使用,與用戶可能的角色無關,這里只關心用戶是否進行了身份驗證。
    初學者工具包的“Admin”目錄也包含一個 Web.config 文件,該文件同樣會對其中包含的每個文件和目錄應用指定的設置。該目錄內容的使用者僅限于那些通過身份驗證而且加入管理員角色的用戶。管理員角色是一個自定義角色。

    因此,切記雖然應用程序可以在根目錄中包含 Web.config 文件,但是在想要操作的子目錄中放置額外的 Web.config 文件就可以覆蓋應用到應用程序級別的那些設置。在圖 5 中對此進行解釋。


     

    圖 5. 對應用程序特定目錄實施精確的控制

    應用根目錄所需的設置

    在啟動并運行 Media Share Library Starter Kit 的成員身份和角色管理系統之前,首先來了解應用程序根目錄中包含的 Web.config 文件所使用的設置。

    默認的成員身份提供程序可以控制應用程序中運行的成員身份系統,但是根 Web.config 文件也很容易將該提供程序覆蓋。默認的成員身份提供程序 SqlMembershipProvider 控制著創建用戶以及登錄應用程序的方式。默認的成員身份提供程序具備許多方面的功能,但就本文示例應用程序而言,我決定覆蓋用戶所需的強密碼功能,以便使登錄過程變得更簡單。雖然這樣做會降低安全性,但是我的想法是使最終用戶能夠使用容易記憶的密碼。程序清單 7 說明如何重新限定 ASP.NET 中的 SqlMembershipProvider。

    程序清單 7. 重新建立 SqlMembershipProvider

    <membership>
       <providers>
          <clear/>
          <add name="AspNetSqlMembershipProvider" 
           type="System.Web.Security.SqlMembershipProvider, System.Web, 
              Version=2.0.0.0, Culture=neutral, 
              PublicKeyToken=b03f5f7f11d50a3a" 
           connectionStringName="LocalSqlServer" 
           requiresQuestionAndAnswer="false" requiresUniqueEmail="true" 
           passwordFormat="Hashed" minRequiredNonalphanumericCharacters="0" 
           minRequiredPasswordLength="3" />
       </providers>
    </membership> 
    

    以上 Web.config 文件的代碼完成了若干任務。在此程序中,第一步是清除之前的提供程序,這些提供程序可能是在任何 Web.config 父文件中聲明的,也可能是 machine.config 文件包含的一部分。這一步是使用 元素完成的。

    清除了程序中之前聲明的提供程序后,下一步就是以我們感興趣的方式建立 SqlMembershipProvider。這是使用 元素完成的。本示例定義 SqlMembershipProvider 所使用的屬性大部分都沒有超出默認的提供程序規范。

    這些屬性中的 name 屬性定義提供程序的名稱。該屬性可以賦值為任何您認為應用程序需要的值。type 屬性指向 SqlMembershipProvider 的實例,我們關注如何使用該提供程序。

    connectionStringName 屬性使用 LocalSqlServer 連接到數據庫。該連接字符串名是對聲明連接的引用,該連接位于程序清單 8 所示的 machine.config 文件的 部分。

    程序清單 8. machine.config 文件中聲明的 LocalSqlServer 連接

    <connectionStrings>
        <add name="LocalSqlServer" 
         connectionString="data source=.\SQLEXPRESS;
            Integrated Security=SSPI;
            AttachDBFilename=|DataDirectory|aspnetdb.mdf;
            User Instance=true" 
         providerName="System.Data.SqlClient" />
      </connectionStrings>
    

    Web.config 的 部分中,需要一個對 SQL Server Express aspnetdb.mdf 文件的連接,如您所見,SqlMembershipProvider 引用了該連接。

    回到上文看一下 SqlMembershipProvider 的聲明,下一個要利用的屬性是 requiresQuestionAndAnswer 屬性。該屬性現在設置為 false,因此將移除新用戶注冊過程中的問題/答案部分。默認情況下,該屬性設置為 true — 即,在用戶注冊應用程序的過程中收集問題/答案。收集這些信息后,最終用戶一旦忘記密碼,就可以利用各種控件提供的信息來獲取自己的密碼。因為媒體共享庫沒有獲取密碼的功能,所以問題/答案部分可以去掉。

    然后將 requiresUniqueEmail 屬性設置為 true,這表示每個用戶必須在注冊過程中輸入一個成員身份數據庫中沒有保存過的電子郵件地址。如果最終用戶提供的電子郵件地址已經存在,那么注冊過程將出現一個驗證錯誤。

    后面的 passwordFormat、minRequiredNonalphanumericCharactersminRequiredPasswordLength 屬性用于控制密碼在應用程序中的管理方式。本示例中的 passwordFormat 設置為 Hashed。這樣設置將使 ASP.NET 先對所提供的密碼進行哈希排列,然后再存儲在數據庫中。用戶以后登錄應用程序時,會對其所提供的密碼進行哈希運算,將結果與數據庫中存儲的哈希字符串進行比較,以便判定數據庫中是否存在匹配項。將 minRequiredNonalphanumericCharacters 設置為 0 之后,就允許提供不包含數字、字母等字符(例如 1、2、3、$、#!)的密碼。最后將 minRequiredPasswordLength 設置為 3,那么只要用戶愿意,就可以輸入只有三個字符的密碼了。

    但是,不要忘記,對 SqlMembershipProvider 作出的這些修改降低了應用程序的安全性。是簡化用戶登錄到應用程序的過程,還是保證應用程序所需的安全性 — 您必須在這兩者之間進行權衡,使用自己滿意的做法。

    應用到 SqlMembershipProvider 的設置,除了根目錄文件 Web.config 中包含的那些設置之外,還有程序清單 9 中所示的其他一些設置,它們用于處理成員身份和角色管理系統。

    程序清單 9. 根目錄文件 Web.config 中的部分代碼

    <configuration 
     xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
       <system.web>
          <roleManager enabled="true" />
          <anonymousIdentification enabled="True" />
          <authentication mode="Forms" />
       </system.web>
    </configuration> 
    

    此處應用的設置首先啟動角色管理系統(在默認情況下禁用該系統)。之后就可以在應用程序啟動時從 Global.asax 文件設立管理員角色。應用程序緊接著將啟動匿名身份驗證功能,以便準許或拒絕匿名用戶,最后再將應用程序的身份驗證模式設置為基于窗體的身份驗證模式。

    完成這些設置后,就表示所有匿名用戶都可以訪問應用程序中的所有文件(除禁止所有用戶訪問的文件之外)。

    那么如何禁止用戶訪問應用程序內的某些特定文件夾呢?下面我們來了解這個內容。

    對其他 Web.config 文件應用設置

    在根目錄文件 Web.config 中配置好這些設置之后,下一步是在應用程序中放置額外的 Web.config 文件,定義拒絕訪問應用程序“Library”和“Admin”文件夾的特定用戶類型。

    首先來看“Library”文件夾中包含的 Web.config 文件。該文件于程序清單 10 中所示。

    程序清單 10. “Library”文件夾中的 Web.config 文件

    <?xml version="1.0" encoding="utf-8"?>
    <configuration 
     xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
        <system.web>
            <authorization>
                <deny users="?" />
            </authorization>
        </system.web>
    </configuration>
    

    如前所述,Web.config 文件可以嵌套。將 Web.config 文件放在“Library”文件夾中可以定義深入的規則,或覆蓋“Library”文件夾中包含的所有文件夾或文件的規則。就本示例而言,我們只關心如何拒絕匿名訪問“Library”文件夾中的每個頁面。這是通過使用在 部分中嵌套的 元素實現的。在該元素內,通過使用 users 屬性可設置一個拒絕所有匿名用戶的規范。值為問號 ("?") 代表所有匿名用戶。那么 意味著最終將拒絕所有匿名用戶訪問 Library 文件夾的內容。如果要查看該文件夾的內容,用戶必須通過應用程序中提供的登錄窗體驗證自己的身份。

    下一個要創建的 Web.config 將放在“Admin”文件夾中。該 Web.config 文件如程序清單 11 所示。

    程序清單 11.“Admin”文件夾中的 Web.config 文件

    <?xml version="1.0"?>
    <configuration 
     xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
          <system.web>
            <authorization>
              <allow roles="Admin" />
              <deny users="*" />
            </authorization>
          </system.web>
    </configuration>
    

    我們只希望屬于管理員角色的注冊用戶擁有訪問“Admin”文件夾內容的權限,所以該 Web.config 文件需要在文檔的 部分同時使用 元素和 元素。

    首先來看 元素,您可能注意到了,對“Library”文件夾中包含的 Web.config 文件應用的屬性值與該元素中用戶屬性的值不相等。此處,我們需要用星號 ("*") 代替問號 ("?") 來表示要拒絕所有匿名用戶。星號指代所有 用戶,包括已注冊和未注冊的用戶。

    設置禁止所有用戶瀏覽“Admin”文件夾后,接下來要做的是允許某些用戶訪問文件中包含的某一個文件。這通過使用 元素實現。我們將使用 roles 屬性代替 users 屬性來指定允許訪問文件中頁面的用戶,因為在此處我們只關注屬于“Admin”角色的用戶。

    為用戶提供登錄和注冊窗體

    到此為止,我們按照自己的意愿配置了應用程序的成員身份和角色管理,接下來為最終用戶提供登錄應用程序的方式。完成該任務的方法有多種,其中 Media Share Library Starter Kit 利用了 Login.aspx 頁面上的登錄服務器控件,如程序清單 12 所示。

    程序清單 12. 使用登錄服務器控件

    <fieldset>
       <legend>Login</legend>
       <br />
       You must first register before you can login. <br /> <br />
       <asp:Login ID="Login1" runat="server" CreateUserUrl="~/Join.aspx" 
        UserNameLabelText="Username:" >
       </asp:Login>
    </fieldset>
    

    Login 服務器控件的代碼并不復雜。僅有的兩處功能擴展是使用 CreateUserUrlUserNameLabelText 屬性。CreateUserUrl 屬性指向應用程序注冊頁面(這里是 Join.aspx)的位置,而 UserNameLabelText 屬性僅用于更改 UserName 標簽的名稱。在瀏覽器中生成該頁面后會產生以下結果,如圖 6 所示。


     

    圖 6. 生成的登錄服務器控件

    Join.aspx 頁面允許匿名用戶注冊該站點,從而使其成為注冊用戶。圖 7 顯示這一兩階段的注冊過程。


     

    圖 7. 用戶注冊初學者工具包應用程序

     

    注冊過程的第一步由用戶進行自定義。該過程的第二步是一個標準過程,盡管我們在 Web.config 文件中指定關閉成員身份系統的問題/答案功能,從而使 ASP.NET 自動移除了安全性問題/答案部分。該控件的代碼如程序清單 13 所示。

    程序清單 13. 使用 CreateUserWizard 服務器控件注冊用戶

    <asp:CreateUserWizard ID="CreateUserWizard1" runat="server" 
     LoginCreatedUser="True">
       <WizardSteps>
          <asp:WizardStep ID="WizardStep1" Runat="server" 
           Title="Personal Information" StepType="Start">
             <table width="100%">
                <tr><td colspan="2">First Step: Enter your personal 
                 information</td></tr>
                <tr><td>
                 Firstname: </td><td>
                <asp:TextBox ID="Firstname" Runat="server"></asp:TextBox>
                </td></tr><tr><td>
                 Lastname: </td><td>
                <asp:TextBox ID="Lastname" Runat="server"></asp:TextBox>
                </td></tr><tr><td>
                 Group: </td><td>
                <asp:TextBox ID="Group" Runat="server"></asp:TextBox>
                </td></tr>
             </table>
          </asp:WizardStep>
          <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
          </asp:CreateUserWizardStep>
          <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
          </asp:CompleteWizardStep>
       </WizardSteps>
    </asp:CreateUserWizard> 
    

    瀏覽過這段代碼,您會發現 CreateUserWizard 控件中定義了三個向導步驟。第一步是通過使用 WizardStep 服務器控件定義的,它是該過程的一個自定義步驟。加入該步驟是為了收集用戶的一些個人信息。收集到的這些信息片斷之后會添加到內置的個性化系統中(稍后討論該內容)。

    第二個向導步驟 CreateUserWizardStep1 是默認的向導步驟,用于詢問用戶的登錄名/密碼以及電子郵件地址。該過程的最后一步是針對完成注冊過程的用戶的。

    CreateUserWizard 控件中最值得關注的一個屬性可能就是 LoginCreatedUser 屬性。該屬性設置為 True 時,CreateUserWizard 控件會自動將剛創建的用戶登記到應用程序中。默認情況下,該屬性設置為 False。

    最終用戶單擊“Create User”按鈕時,Join.aspx 頁面將在代碼隱藏頁面中啟動以下事件(如程序清單 14 所示)。

    程序清單 14. 創建用戶的按鈕事件

    Protected Sub CreateUserWizard1_ContinueButtonClick(ByVal sender As 
       Object, ByVal e As System.EventArgs) Handles 
       CreateUserWizard1.ContinueButtonClick
            
       ' Assign Profile items entered through registration process.
       Profile.FirstName = Firstname.Text
       Profile.LastName = Lastname.Text
       Profile.Group = Group.Text
       Profile.MemberSince = DateTime.Now()
       Profile.Email = CreateUserWizard1.Email
       Response.Redirect("~/Default.aspx")
    End Sub
    

    該事件會將各條用戶的個人信息保存在個性化系統中,然后再將用戶重定向為根目錄中 Default.aspx 頁面的注冊用戶。

    使用個性化系統

    正如您在上文的代碼清單中看到的,我們存儲了一些最終用戶的個人信息。這些信息存儲在 ASP.NET 2.0 提供的內置個性化系統中。

    為了激活該系統,必須在根目錄的 Web.config 文件中添加一些設置聲明。如程序清單 15 所示。

    程序清單 15. 聲明應用程序的個性化屬性

    <profile>
       <properties>
          <add name="FirstName" />
          <add name="LastName" />
          <add name="Email" />
          <add name="Group" />
          <add name="MemberSince" type="System.DateTime" />
       </properties>
    </profile> 
    

    個性化屬性的聲明在 Web.config 文件的 部分中進行。在 部分內創建一個 部分,在其中可以添加一系列 元素。這些 元素用于聲明具體的配置文件屬性。在本示例中要聲明 5 個屬性 — FirstName、LastName、Email、GroupMemberSince。MemberSince 屬性甚至需要通過添加 type 屬性來進一步定義,后者用于指定前者的屬性類型(此處為 System.DateTime)。而其他配置文件屬性則不需要進一步應用這一規范,這表示它們將應用默認的 System.String 類型。

    將這小段代碼放在 Web.config 中后,就可以按以下方式為這些屬性賦值了:

    Profile.FirstName = TextBox1.Text
    

    您也可以使用自己賦值的屬性值:

    TextBox1.Text = Profile.Email
    

    在下一篇 ASP.NET Jumpstart 文章中,您將了解到如何在一些 ASP.NET 頁面的表述中使用這些配置文件屬性。

    應用樣式

    ASP.NET 2.0 還為您提供了在中央位置對頁面應用樣式的方法。ASP.NET 主題(本文前面提到過)允許將服務器控件以及其他頁面元素的所有樣式放置在應用程序中的同一個位置。

    要構建集中樣式的數據存儲,可以在應用程序中創建一個名為 App_Themes 的文件夾。在該文件夾中再創建另一個文件夾,以便創建主題或樣式集合,應用程序中的各個頁面都可以使用該樣式集合。將該文件夾命名為您的主題名。您可以在 App_Themes 文件夾中添加任意數量的主題。進行 Media Share Library Starter Kit 的基本安裝時,只有一個標題為 Evjen 的主題。

    主題可以包含一個皮膚或 CSS 文件集合。Evjen 主題同時包含這兩個元素。CSS 文件是標準文件,處理它的方式應該與正常處理 CSS 文件的方式沒有差別。而皮膚文件對于大多數人而言都不太熟悉。它是一個 XML 文件,用于聲明應用程序中包含的服務器控件的標準外觀顯示。查看 Evjen.skin 文件時,您將看到服務器控件聲明的一個簡短列表。程序清單 16 顯示其中一個控件的聲明。

    程序清單 16. Evjen.skin 文件中聲明的菜單服務器控件

    <asp:Menu runat="server" Font-Bold="True" StaticDisplayLevels="5" 
     BackColor="#F7F6F3" DynamicHorizontalOffset="2" Font-Names="Verdana" 
     Font-Size="0.8em" ForeColor="#7C6F57" StaticSubMenuIndent="10px" 
     Width="100%" BorderColor="Brown" BorderWidth="1">
        <StaticSelectedStyle BackColor="#F7F6F3" />
        <StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
        <DynamicHoverStyle BackColor="#7C6F57" Font-Bold="False" 
         ForeColor="White" />
        <DynamicMenuStyle BackColor="#F7F6F3" />
        <DynamicSelectedStyle BackColor="#F7F6F3" />
        <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
        <StaticHoverStyle BackColor="#7C6F57" Font-Bold="True" 
         ForeColor="White" />
    </asp:Menu> 
    

    瀏覽該控件聲明時,您會注意到代碼中沒有聲明任何行為。而只是聲明了樣式。還要注意的一點是,該控件聲明中沒有使用 ID 屬性。這是由于該服務器控件代碼將應用到 Menu 服務器控件的每個示例,這里是指應用 Evjen 主題的頁面上所使用的 Menu 服務器控件。

    如何對一個頁面應用 Evjen 主題(或您的自定義主題)?可以使用 @Page 指令中的 Theme 屬性,程序清單 17 對此進行說明。

    程序清單 17. 內容頁面的 @Page 指令

    <%@ Page Language="VB" MasterPageFile="~/MediaLibraryMain.master" 
        AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" 
        Title="Media Share Library" Theme="Evjen" %>
    

    如果想在一個中央位置保留所有樣式設置,這是個不錯的方法。一旦以后要修改應用程序的整體外觀時,在同一個位置作出更改就可以在整個應用程序中反映出來。這真是太簡單不過了!

    小結

    本文為您介紹如何構建 Media Share Library Starter Kit 的基礎。其中,首先介紹了如何將母版頁應用到您的應用程序。然后,介紹了成員身份和角色管理系統,以及如何應用個性化設置、導航等功能。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: asp net 程序 構建 框架 網頁 應用 jumpstart


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>