ASP.NET中如何每一頁呼叫公用Function(PageBase)

摘要: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撰寫

    1. 首先在專案上按滑鼠右鍵→加入新項目→選擇類別→名稱為【PageBase.vb】,接著如果您沒有開啟個App_Code的資料夾,系統會問是否要新增App_Code資料夾,並將該類別的程式內容放入該資料夾中,此時選是,會在App_Code中增加一個PageBase.vb的程式,並且程式內容為一個空的Class
    2. 接著,把剛剛CodeFile要繼承System.Web.UI.Page的那行指令複製到PageBase中如下
      Imports Microsoft.VisualBasic 
      
      Public Class PageBase 
          Inherits System.Web.UI.Page 
      
      End Class

      此時就能夠發現該Class有了Page的相關事件可以選用
    3. 接著就來寫一下測試的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
      寫完後請記得儲存一下,其他畫面才能夠直接使用剛剛撰寫在PageBase中的程式與屬性
    4. 再來新增一個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" />&nbsp;</div> 
          </form> 
      </body> 
      </html>

      CodeFile:default2.aspx.vb
      原本繼承System.Web.UI.Page的地方,現在改成繼承剛剛的PageBase
      Partial 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選項直接選用。

因此一些公用的程式,就可以透過這樣的方式來處理。

 


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6) 
topcat
Blog:http://www.dotblogs.com.tw/topcat