2010-05-21 67 views
2

我想在Global.asax中設置主頁面屬性。在ASP.NET中設置Global.asax主頁面

這就是我所做的,但是我在第一行得到了一個NullReferenceException。任何想法如何做到這一點?

protected void Application_PreSendRequestContent(Object sender, EventArgs e) 
{ 
    System.Web.UI.Page page = System.Web.HttpContext.Current.Handler as System.Web.UI.Page;    

    if (Session["lang"] == "eng") 
    { 
     page.MasterPageFile = "SideMasterPageEng.master"; 
    } 
} 

回答

3

Application_PreSendRequestContent是太晚在頁面生命週期內這樣做。 此階段已經執行了MasterPage。

Global.asax確實是應用程序事件的地方,而不是頁面特定的。請注意,Application_BeginRequest等許多應用程序事件都是在任何請求上調用的,而不僅僅是aspx Page請求。這些事件中的許多事件都是針對所請求的每個js腳本,圖像,css文件等引發的。

這裏是事件在Global.asax中一個很好的列表:https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5771721.html

,我知道,你肯定可以改變主頁面在頁面Page_PreInitevent處理器唯一的地方

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    this.Page.MasterPageFile = "~/Custom.master"; 
} 

編輯: 閱讀你的評論,這聽起來對你來說,你需要從一個基本頁面派生你的頁面,這個頁面會在一個地方做出改變。

using System; 
namespace TestWebApplication 
{ 
    public class PageBase : System.Web.UI.Page 
    { 
     protected void Page_PreInit(object sender, EventArgs e) 
     { 
      Page.MasterPageFile = "~/Custom.master"; 
     } 
    } 
} 

然後改變所有的頁面繼承這個而不是System.Web.UI.Page ...

//public partial class WebForm1 : System.Web.UI.Page 
public partial class WebForm1 : PageBase 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 
+0

嗨, 那就是如何我此刻卻用做新的頁面一直在添加,而且我已經在代碼中改變了幾次邏輯,它開始變得亂七八糟,更新文件,這就是爲什麼我只想在一個地方做這個。 我會嘗試PreRequestHandlerExecute,看看發生了什麼! 謝謝 – StefanE 2010-05-21 12:49:44

+0

看我的編輯。使用您的所有頁面繼承的基本頁面 – 2010-05-21 13:04:36

+0

好的,那太棒了!我爲此贊成10票。我確實找到了一種在Application_PreRequestHandlerExecute中執行此操作的方法,但其他問題卻顯示出來了。我設置的會話變量尚未更新,它在此事件後執行..但是此代碼需要不捕獲每個事件。 如果(Context.Handler是IRequiresSessionState || Context.Handler是IReadOnlySessionState) {// 代碼 } – StefanE 2010-05-21 13:23:31