如何从子页面的Page_Load中分配基页元素的值?

时间:2011-11-09 14:27:37

标签: c# asp.net inheritance

我可能不是第一个遇到这个问题的人,但我找不到这样的问题和解决方案。

我有一个基本.aspx页面和子页面,它继承自基页。 从孩子的Page_Load方法开始,我在base.SetLiteral(value)这样的基页上调用一个方法,该方法接受基页中定义的文字。我得到一个NullReferenceException,因为文字是null。

它可能与页面生命周期有关,因为基页的控件尚未在那时实现。

我该怎么做?

修改

这是异常的堆栈跟踪。对我没有说什么。

System.NullReferenceException was unhandled by user code
Message=Object reference not set to an instance of an object.
Source=PageInheritance
StackTrace:
   at PageInheritance.BasePage.SetLiteral(String value) in D:\crap-projects\PageInheritance\BasePage.aspx.cs:line 17
   at PageInheritance.Page1.Page_Load(Object sender, EventArgs e) in D:\crap-projects\PageInheritance\Page1.aspx.cs:line 13
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:  

4 个答案:

答案 0 :(得分:1)

你是对的,当基页控件未初始化时会发生这种情况。

如果您还没有,请查看ASP.NET Page Life Cycle Overview - Life-Cycle Events。正如您所看到的,应该Page_Load中工作,我真的没有看到问题所在。尝试稍后在页面生命周期中将事件移动到事件,例如LoadComplete事件。

答案 1 :(得分:1)

好吧,看起来当一个人继承.aspx页面时,它只是后面的代码被继承。标记(.aspx本身)不是继承的,并且没有办法(如Master页面中的ContentPlaceHolder)定义想要在结果页面上的元素(来自派生,基页或两者)。

由于基础.aspx页面未被继承,因此在设计器中未初始化时未添加任何控件。我真的不明白它是如何工作的(调用了Page_Init,但是页面决定不初始化它的控件是一种迷惑)有人可以解释这一点吗?

我可能不得不使用母版页来实现我的目标,但我会继续研究并更新我的问题。

如果我在某个地方弄错了,请告诉我。

修改

是的,我使用Master页面而不是.aspx页面继承实现了我需要做的事情。那里没有任何问题。

P.S。

我确实找到了一种方法来继承一个在基页中有标记的.aspx页面:http://www.codeproject.com/KB/aspnet/page_templates.aspx但它对我来说似乎是完全的hackery。

答案 2 :(得分:0)

我不确定这是否适用于您的问题,但您可以创建一个类,并让两个页面都继承自同一个类,而这些类将继承自基本System.Web.UI.Page。 您可以将共享方法放在新类中,并且可以从两个页面访问它。

答案 3 :(得分:0)

有些东西似乎不对,但如果是这种情况,您可以尝试在初始化控件时触发的基页上创建一个事件处理程序:

在基页:

public event EventHandler BasePageInitialized;

protected void Page_Load(object sender, EventArgs e)
{
    if (this.BasePageInitialized != null)
        this.BasePageInitialized(this, e);
}

在子页面中:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
        base.BasePageInitialized += new EventHandler(Base_Initialized);
}

protected void Base_Initialized(object sender, EventArgs e)
{
    base.SetLiteral(value)
}