2013-04-22 61 views
0

完成我的asp項目後,我想出了一個新的要求。爲此,我必須在所有頁面加載事件中執行一些代碼。我可以爲所有這些頁面加載獲取事件嗎?我無法使用Global.asax的Session_start,因爲它將包含具有會話狀態的WebHandler。有任何想法嗎?是否有任何內置的事件在asp.net中觸發所有的PageLoads?

+0

也許你可以把代碼放在Master中,但是你的請求太含糊。你也可以繼承相同的頁面。 – 2013-04-22 11:32:41

+0

如上所述,如果您使用的是Master,則Page_Load最適合您。 – 2013-04-22 11:33:31

+0

沒有主頁面。 @ChrisDixon – 2013-04-22 11:33:37

回答

1

會話開始不適合,因爲它只會被轟出了新的會話,而不是每次加載頁面。

有幾個選項,包括使用所有頁面繼承的基本頁面。這意味着您需要記住將其鏈接到所有頁面。

我的建議是編寫一個爲所有aspx頁面加載而啓動的http模塊。

您將需要創建一個實現System.Web.IHttpModule的模塊。

using System; 
using System.Web; 
public class HelloWorldModule : IHttpModule 
{ 
    public HelloWorldModule() 
    { 
    } 

    public String ModuleName 
    { 
     get { return "HelloWorldModule"; } 
    } 

    // In the Init function, register for HttpApplication 
    // events by adding your handlers. 
    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += 
      (new EventHandler(this.Application_BeginRequest)); 
     application.EndRequest += 
      (new EventHandler(this.Application_EndRequest)); 
    } 

    private void Application_BeginRequest(Object source, 
     EventArgs e) 
    { 
    // Create HttpApplication and HttpContext objects to access 
    // request and response properties. 
     HttpApplication application = (HttpApplication)source; 
     HttpContext context = application.Context; 
     string filePath = context.Request.FilePath; 
     string fileExtension = 
      VirtualPathUtility.GetExtension(filePath); 
     if (fileExtension.Equals(".aspx")) 
     { 
      context.Response.Write("<h1><font color=red>" + 
       "HelloWorldModule: Beginning of Request" + 
       "</font></h1><hr>"); 
     } 
    } 

    public void Dispose() { } 
} 

然後在web.config鉤它按照這裏的例子。

<httpModules> 
    <add name="HelloWorldModule" type="HelloWorldModule" /> 
</httpModules> 

您需要檢查context.Request.Path屬性模塊中排除任何請求,其中的路徑我以前不符合條件(即不結束ASPX)。

更多的信息在這裏。 http://www.4guysfromrolla.com/demos/printPage.aspx?path=/articles/011404-1.aspx

+0

不知道如何回答這個問題。它不處理PageLoad事件。它只是在全局asax中處理Application_BeginRequest的等價物。 – Egor4eg 2013-04-22 11:58:51

+0

此外,如果頁面有另一個擴展名(不是「aspx」),它將不起作用。這可能發生在例如路由的情況下。 – Egor4eg 2013-04-22 11:59:49

+0

我的印象是OP只是想在每次頁面被擊中時觸發一些代碼。 OP,如果你能爲我們提供您的使用情況下,一些更多的信息(什麼樣的代碼是你想火每個頁面加載?),那麼我們可以提供更好的答案。 @ Egor4eg - 這是真的,路由/ URL重寫可能會導致問題。您可以通過擴展構成頁面的邏輯(使用balck列表而不是白名單等)或使用基本頁面來解決此問題。再一次,用例會幫助我們更好地回答你的問題。 – CountZero 2013-04-22 12:09:26

2

您保留一個基頁並從所有aspx頁面繼承它。這樣可以保持邏輯的集中。

ASPX頁面

public partial class MyAspxPage : BasePage 
{ 

} 

基頁

public class BasePage : Page 
{ 
    protected override void OnLoad(EventArgs e) 
    { 

    } 
} 

你也應該離開AutoEventWireup設置爲false。

+0

但我仍想瀏覽所有的網頁!對? – 2013-04-22 11:43:18

+0

將基本頁面中的加載事件和其負載處理程序中的邏輯保持在一起。 Don在aspx頁面的單獨處理程序中執行此操作。 – 2013-04-22 11:45:59

+0

@SubinJacob基頁和HttpHandler的區別是,HttpHandler的將執行的頁面加載邏輯,所有的應用程序頁面,這可能會執行它甚至對於那些不想做到這一點,並在另一方面的BasePage將執行對這些頁面,你想。 – 2013-04-22 11:57:23

0

我認爲這裏最好的解決方案應該是創建一個自定義的基頁類,它實現PageLoad,然後繼承它的所有頁面。

喜歡的東西:

public abstract class BasePage: Page 
{ 
    protected void Page_Load(object sender, EventArgs e) { 
     // your code 
    } 
} 

您可以在web.config中註冊基本頁面類:在給出用戶

<system.web> 
    <!-- ... --> 
    <pages pageBaseType="MyWeb.UI.BasePage" /> 
    <!-- ... --> 
</system.web> 
+0

'MyWeb.UI.PageBase'或'MyWeb.UI.BasePage' – 2013-04-22 12:08:26

+0

'錯誤\t \t 21無法加載類型 'MyWeb.UI.BasePage'。 \t \t ' – 2013-04-22 12:10:50

+0

你有相同的命名空間在我的例子嗎? (「MyWeb.UI」) – Egor4eg 2013-04-22 12:11:45

相關問題