推薦:ASP.NET應用程序資源訪問安全模型1、前言ASP.NET WEB應用程序通常屬于多層體系結構,一般從邏輯結構上可以分為表示層、業務邏輯層和數據訪問層;客戶端要訪問應用程序資源,其身份認證和授權必然要跨越多個層次。本文主要討
除了代碼和標記之外,ASP.NET 2.0頁面還可以包含服務器控件,它們是可編程的服務器端對象,典型情況下表現為頁面中的UI元素(例如文本框或圖像)。服務器控件參與頁面的執行過程,并給客戶端生成自已的標記呈現內容。服務器控件的優勢在于,它讓開發者從簡單的積木式的組件中獲取復雜的呈現方式和操作行為,極大地減少了生成動態Web頁面所需要編寫的代碼量;另外一個優勢是,定制它們的呈現方式和行為非常簡單。服務器控件所暴露的屬性可以通過宣告式(在標記中)或編程(在代碼中)設置。服務器控件(和頁面控件本身)還暴露了一些事件,開發者可以處理這些事件,在頁面執行的過程中,或者響應向服務器發回頁面的客戶端操作(Postback)的時候,所需來執行的特定操作。服務器控件還簡化了保留狀態信息的問題,它會自動地在多個成功的“發回” 操作之間保留值。
服務器控件是在.aspx文件中使用自定義標記或固有的HTML標記聲明的,它包含了runat="server"屬性值。固有的HTML標記是由System.Web.UI.HtmlControls名字空間中的一個控件來處理的。沒有顯式地映射到某個控件的標記會被指定為System.Web.UI.HtmlControls.HtmlGenericControl類型。
下面的例子使用了四個服務器控件:<form runat=server>、<asp:textbox runat=server>、<asp:dropdownlist runat=server>和<asp:button runat=server>。在運行的時候這些服務器控件自動地生成HTML內容。
以下為引用的內容: <form action="intro4_VB.aspx" method="post" runat=server> <h3> Name: <asp:textbox id="Name" runat="server"/> Category: <asp:dropdownlist id="Category" runat=server> <asp:listitem >psychology</asp:listitem> <asp:listitem >business</asp:listitem> <asp:listitem >popular_comp</asp:listitem> </asp:dropdownlist> </h3> <asp:button text="Lookup" runat="server"/> </form> |
請注意:這些服務器控件自動地保留了往返于服務器之間的客戶端所輸入的值。這些控件狀態并非存儲在服務器上(它們存儲在往返于請求之間的<input type="hidden">窗體字段中)。它不需要客戶端腳本。
除了支持標準的HTML輸入控件之外,ASP.NET還允許開發者在頁面中使用豐富的定制控件。例如,下面的例子演示了如何使用<asp:adrotator>控件在頁面上動態地顯示滾動廣告。
以下為引用的內容: <form action="intro5_VB.aspx" method="post" runat="server"> <asp:adrotator AdvertisementFile="ads.XML" BorderColor="black" BorderWidth=1 runat="server"/> <h3> Name: <asp:textbox id="Name" runat="server"/> Category: <asp:dropdownlist id="Category" runat=server> <asp:listitem >psychology</asp:listitem> <asp:listitem >business</asp:listitem> <asp:listitem >popular_comp</asp:listitem> </asp:dropdownlist> </h3> <asp:button text="Lookup" runat="server"/> </form> |
處理服務器控件事件
每個ASP.NET服務器控件都能夠暴露一個對象模型,它包含了屬性、方法和事件。ASP.NET開發者可以使用這個對象模型清晰地修改頁面、與頁面交互操作。
下面的例子演示了ASP.NET頁面開發者如何處理<asp:button runat=server>控件的OnClick事件來改變<asp:label runat=server>控件的Text屬性的。
以下為引用的內容: <html> <head> <link rel="stylesheet"href="intro.css"> </head> <script language="VB" runat=server> Sub SubmitBtn_Click(Sender As Object, E As EventArgs) Message.Text = "Hi " & HttpUtility.HtmlEncode(Name.Text) & ", you selected: " & Category.SelectedItem.Text End Sub </script> <body> <center> <form action="intro6_VB.aspx" method="post" runat="server"> <asp:adrotator AdvertisementFile="ads.XML" BorderColor="black" BorderWidth=1 runat="server"/> <h3> Name: <asp:textbox id="Name" runat="server"/> Category: <asp:dropdownlist id="Category" runat=server> <asp:listitem >psychology</asp:listitem> <asp:listitem >business</asp:listitem> <asp:listitem >popular_comp</asp:listitem> </asp:dropdownlist> </h3> <asp:button text="Lookup" OnClick="SubmitBtn_Click" runat="server"/> <p> <asp:label id="Message" runat="server"/> </form> </center> </body> </html> |
這個簡單的例子與前面演示的“Intro3”示例功能相當。請注意,在這個新的基于服務器控件的例子中,代碼變得非常清晰和簡單了。我們以后還將看到,ASP.NET頁面框架組件也暴露了大量的頁面層次的事件,在頁面的處理過程中,你可以編寫在特定時間執行的代碼。這些事件包括Page_Load和Page_Render。
使用服務器控件
ASP.NET服務器控件是在頁面中使用包含runat="server"屬性的宣告式標記來定義的。下面的例子聲明了三個<asp:label runat="server">服務器控件,并定義了每個控件的文本和樣式屬性。
以下為引用的內容: <html> <body> <h3><font face="Verdana">Declaring Server Controls</font></h3> This sample demonstrates how to declare the <asp:label> server control and manipulate its properties within a page. <p> <hr> <asp:label id="Message1" font-size="16" font-bold="true" forecolor="red" runat=server>This is Message One</asp:label> <br> <asp:label id="Message2" font-size="20" font-italic="true" forecolor="blue" runat=server>This is Message Two</asp:label> <br> <asp:label id="Message3" font-size="24" font-underline="true" forecolor="green" runat=server>This is Message Three</asp:label> </body> </html> |
操作服務器控件
你可以用編程的方式,通過提供ASP.NET服務器控件的id屬性來識別服務器控件;還可以在運行時刻,使用這個id指針來編程操作該服務器控件的對象模型。例如,下面的例子演示了頁面開發者如何在Page_Load事件中編程設置<asp:label runat="server">控件的Text屬性。
以下為引用的內容: <html> <script language="VB" runat="server"> Sub Page_Load(Sender As Object, E As EventArgs) Message.Text = "You last ACCESSed this page at: " & DateTime.Now End Sub </script> <body> <h3><font face="Verdana">Manipulating Server Controls</font></h3> This sample demonstrates how to manipulate the <asp:label> server control within the Page_Load event to output the current time. <p> <hr> <asp:label id="Message" font-size="24" font-bold="true" runat=server/> </body> </html> |
處理控件的事件
ASP.NET服務器控件也可以暴露和引發服務器事件,以供頁面開發者處理。頁面開發者可以通過宣告式地給每個控件編寫事件來實現這項功能(在這種情況下,事件的屬性名稱表明事件的名稱,屬性的值表明被調用的方法的名稱)。例如,下面的代碼示例演示了如何給按鈕控件編寫OnClick事件。
以下為引用的內容: <html> <script language="VB" runat="server"> Sub EnterBtn_Click(Sender As Object, E As EventArgs) Message.Text = "Hi " & Name.Text & ", welcome to ASP.NET!" End Sub </script> <body> <h3><font face="Verdana">Handling Control Action Events</font></h3> <p> This sample demonstrates how to ACCESS a <asp:textbox> server control within the "Click" event of a <asp:button>, and use its content to modify the text of a <asp:label>. <p> <hr> <form action="controls3.aspx" runat=server> <font face="Verdana"> Please enter your name: <asp:textbox id="Name" runat=server/> <asp:button text="Enter" Onclick="EnterBtn_Click" runat=server/> <p> <asp:label id="Message" runat=server/> </font> </form> </body> </html> |
處理多個服務器事件
事件處理程序為頁面開發者在ASP.NET頁面中構造邏輯提供了一條清晰的途徑。例如,下面的例子演示了如何在一個頁面上處理四個按鈕事件。
以下為引用的內容: <html> <script language="VB" runat="server"> Sub AddBtn_Click(Sender As Object, E As EventArgs) If Not (AvailableFonts.SelectedIndex = -1) InstalledFonts.Items.Add(New ListItem(AvailableFonts.SelectedItem.Value)) AvailableFonts.Items.Remove(AvailableFonts.SelectedItem.Value) End If End Sub Sub AddAllBtn_Click(Sender As Object, E As EventArgs) Do While Not (AvailableFonts.Items.Count = 0) InstalledFonts.Items.Add(New ListItem(AvailableFonts.Items(0).Value)) AvailableFonts.Items.Remove(AvailableFonts.Items(0).Value) Loop End Sub Sub RemoveBtn_Click(Sender As Object, E As EventArgs) If Not (InstalledFonts.SelectedIndex = -1) AvailableFonts.Items.Add(New ListItem(InstalledFonts.SelectedItem.Value)) InstalledFonts.Items.Remove(InstalledFonts.SelectedItem.Value) End If End Sub Sub RemoveAllBtn_Click(Sender As Object, E As EventArgs) Do While Not (InstalledFonts.Items.Count = 0) AvailableFonts.Items.Add(New ListItem(InstalledFonts.Items(0).Value)) InstalledFonts.Items.Remove(InstalledFonts.Items(0).Value) Loop End Sub </script> <body> <h3><font face="Verdana">Handling Multiple Control Action Events</font></h3> <p> This sample demonstrates how to handle multiple control action events raised from different <asp:button> controls. <p> <hr> <form action="controls4.aspx" runat=server> <table> <tr> <td> Available Fonts </td> <td> <!-- Filler --> </td> <td> Installed Fonts </td> </tr> <tr> <td> <asp:listbox id="AvailableFonts" width="100px" runat=server> <asp:listitem>Roman</asp:listitem> <asp:listitem>Arial Black</asp:listitem> <asp:listitem>Garamond</asp:listitem> <asp:listitem>Somona</asp:listitem> <asp:listitem>Symbol</asp:listitem> </asp:listbox> </td> <td> <!-- Filler --> </td> <td> <asp:listbox id="InstalledFonts" width="100px" runat=server> <asp:listitem>Times</asp:listitem> <asp:listitem>Helvetica</asp:listitem> <asp:listitem>Arial</asp:listitem> </asp:listbox> </td> </tr> <tr> <td> <!-- Filler --> </td> <td> <asp:button text="<<" OnClick="RemoveAllBtn_Click" runat=server/> <asp:button text="<" OnClick="RemoveBtn_Click" runat=server/> <asp:button text=">" OnClick="AddBtn_Click" runat=server/> <asp:button text=">>" OnClick="AddAllBtn_Click" runat=server/> </td> <td> <!-- Filler --> </td> </tr> </table> </form> </body> </html> |
執行頁面導航(第一種情況)
在實際的Web應用程序中,多個頁面之間的導航是常見的。下面的例子演示了如何使用<asp:hyperlink runat=server>控件導航到另外一個頁面(同時傳遞了自定義的查詢字符串參數)。接著這個例子演示了如何輕易地在目標頁面上得到這些查詢字符串參數。
以下為引用的內容: <html> <script language="VB" runat="server"> Sub Page_Load(Sender As Object, E As EventArgs) Dim RandomGenerator As Random RandomGenerator = New Random(DateTime.Now.Millisecond) Dim RandomNum As Integer RandomNum = RandomGenerator.Next(0, 3) Select RandomNum Case 0: Name.Text = "Scott" Case 1: Name.Text = "Fred" Case 2: Name.Text = "Adam" End Select AnchorLink.NavigateUrl = "controls_navigationtarget_VB.aspx?name=" & System.Web.HttpUtility.UrlEncode(Name.Text) End Sub </script> <body> <h3><font face="Verdana">Performing Page Navigation (Scenario 1)</font></h3> <p> This sample demonstrates how to generate a HTML Anchor tag that will cause the client to navigate to a new page when he/she clicks it within the browser. <p> <hr> <p> <asp:hyperlink id="AnchorLink" font-size=24 runat=server> Hi <asp:label id="Name" runat=server/> please click this link! </asp:hyperlink> </body> </html> |
執行頁面導航(第二種情況)
并非所有的頁面導航都由客戶端的超級鏈接發起。ASP.NET頁面開發者調用Response.Redirect(url)方法也可以發起客戶端頁面的重定向或導航。這種情況典型發生在真正進行導航之前,服務器端需要驗證客戶端的輸入信息的時候。
下面的例子演示了如何使用Response.Redirect方法把參數傳遞到另外一個目標頁面。它還演示了如何在目標頁面上簡單地獲取這些參數。
以下為引用的內容: <html> <script language="VB" runat="server"> Sub EnterBtn_Click(Sender As Object, E As EventArgs) If Not (Name.Text = "") Response.Redirect("Controls_NavigationTarget_VB.aspx?name=" & System.Web.HttpUtility.UrlEncode(Name.Text)) Else Message.Text = "Hey! Please enter your name in the textbox!" End If End Sub </script> <body> <h3><font face="Verdana">Performing Page Navigation (Scenario 2)</font></h3> <p> This sample demonstrates how to navigate to a new page from within a <asp:button> click event, passing a <asp:textbox> value as a querystring argument (validating first that the a legal textbox value has been specified). <p> <hr> <form action="controls6.aspx" runat=server> <font face="Verdana">Please enter your name: <asp:textbox id="Name" runat=server/> <asp:button text="Enter" Onclick="EnterBtn_Click" runat=server/> <p> <asp:label id="Message" forecolor="red" font-bold="true" runat=server/> </font> </form> </body> </html>
|
分享:ASP.NET 2.0中執行數據庫操作命令之一數據庫命令執行時使用Command對象。Command類有三種:SqlCommand、OleDbCommand與OdbcCommand。Command對象主要用來運行SELECT、INSERT、UPDATE或DELETE之類的SQL語句。Command對象還可以調