摘要:ASP.NET中如何每一頁呼叫公用Function(PageBase)
小喵在規劃著ASP.NET權限控管的過程中,遇到了一個問題狀況
小喵需要一個可以呼叫的共用程式,該程式可以再每一頁執行的時候,自動的到資料庫中檢查使用者瀏覽的該頁面是否有權限可以瀏覽、並且取得該頁面相關功能的權限(是否可以新增修改刪除查詢等),並且傳回該畫面的Title並修改之。還要紀錄使用者瀏覽紀錄以備未來查閱。
這時候遇到的第一個問題是,要用什麼方式,才能夠在撰寫各ASPX的時候使用最少的程式碼,才能讓這些功能自動,第二個問題,當小喵有共用的程式需要呼叫時,要用什麼方式呢
MasterPage是否合用??(MasterPage的PageLoad在各頁面PageLoad之後)
小喵想到的第一個是MasterPage是否可以達到這樣的目的,因為小喵的每一頁都有使用MasterPage,或許可以在MasterPage中的PageLoad事件中,讓他先執行小喵要做的事情,這樣每一頁就能夠使用了。不過事與願違,小喵發現:【MasterPage的PageLoad】竟然發生在【ContentPage的PageLoad之後】,這意味著,如果這樣寫,Content Page就無法在PageLoad中呼叫共用的Function處理事情。
PageBase介紹
在介紹PageBase前,首先感謝Allen大大提供的方式,讓小喵在黑暗中找到一展明燈。
當新增aspx並使用CodeFile的方式時,可以看到CodeFile中一開始會有以下這些內容
Partial Class Default
Inherits System.Web.UI.Page
End Class
其中該Class繼承了Inherits System.Web.UI.Page,PageBase的方式就是寫一個Class替代掉這個
PageBase撰寫
-
-
首先在專案上按滑鼠右鍵→加入新項目→選擇類別→名稱為【PageBase.vb】,接著如果您沒有開啟個App_Code的資料夾,系統會問是否要新增App_Code資料夾,並將該類別的程式內容放入該資料夾中,此時選是,會在App_Code中增加一個PageBase.vb的程式,並且程式內容為一個空的Class
- 接著,把剛剛CodeFile要繼承System.Web.UI.Page的那行指令複製到PageBase中如下
Imports Microsoft.VisualBasic Public Class PageBase Inherits System.Web.UI.Page End Class
此時就能夠發現該Class有了Page的相關事件可以選用 - 接著就來寫一下測試的Function,Property來測試看看,我們寫了個SayHi的Funcation,以及一個屬性來測試一下,原始碼如下
Imports Microsoft.VisualBasic Public Class PageBase Inherits System.Web.UI.Page Public Function SayHello(ByVal InStr As String) As String Return "Hello," + InStr End Function Dim _BrwP As Boolean = False Public Property BrwP() As Boolean '瀏覽屬性 Get Return _BrwP End Get Set(ByVal value As Boolean) _BrwP = value End Set End Property Public Sub ChkBrwP(ByVal UID As String) If UID = "topcat" Then Me.BrwP = True Else Me.BrwP = False End If End Sub Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Response.Write("PageBase Load.<br>") End Sub End Class
- 再來新增一個aspx來測試一下,相關內容如下:
default2.aspx<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default2.aspx.vb" Inherits="Default2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>未命名頁面</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="btn1" runat="server" Text="設定UID為Topcat" /><br /> <asp:Button ID="btn2" runat="server" Text="設定UID為John" /> </div> </form> </body> </html>
CodeFile:default2.aspx.vb
原本繼承System.Web.UI.Page的地方,現在改成繼承剛剛的PageBasePartial Class Default2 Inherits PageBase Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim UID As String = Request.QueryString("UID") Dim Rc As String = Me.SayHello(UID) Response.Write("Default2.aspx Load.<br>") Response.Write(Rc & "<br>") Me.ChkBrwP(UID) Response.Write(Me.BrwP.ToString) End Sub Protected Sub btn2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn2.Click Response.Redirect("default2.aspx?UID=John") End Sub Protected Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn1.Click Response.Redirect("default2.aspx?UID=topcat") End Sub End Class
-
測試結果:
從結果可以看出,PageBase的Page Load事件在Default2.aspx的Page Load之前,並且可以透過【Me.】的方式彈出PageBase撰寫的Function,Sub,Properity選項直接選用。
因此一些公用的程式,就可以透過這樣的方式來處理。
以下是簽名:
- 歡迎轉貼本站的文章,不過請在貼文主旨上加上【轉貼】,並在文章中附上本篇的超連結與站名【topcat姍舞之間的極度凝聚】,感恩大家的配合。
- 小喵大部分的文章會以小喵熟悉的語言VB.NET撰寫,如果您需要C#的Code,也許您可以試著用線上的工具進行轉換,這裡提供幾個參考
Microsoft MVP Visual Studio and Development Technologies (2005~2019/6) | topcat Blog:http://www.dotblogs.com.tw/topcat |