在ASP.NET中从Global.asax设置Masterpage

时间:2010-05-21 12:09:14

标签: 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";
    }
}

1 个答案:

答案 0 :(得分:3)

Application_PreSendRequestContent在页面生命周期中为时已晚,无法执行此操作。 MasterPage已经在此阶段执行。

Global.asax实际上是应用程序事件的一个地方,而不是特定于页面的地方。请注意,许多应用程序事件(如Application_BeginRequest)都会在任何请求上调用,而不仅仅是aspx页面请求。许多这些事件都会被请求的每个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)
    {

    }
}