如何从子页面's Page_Load中为基页元素赋值

本文关键字:Load Page 赋值 元素 基页 | 更新日期: 2023-09-27 18:14:02

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

我有一个基本的。aspx页面和从基本页面继承的子页面。从child的Page_Load方法中,我调用基页(如base.SetLiteral(value))上的方法,该方法访问基页中定义的文字。我得到一个NullReferenceException,因为字面量是空的。

这可能与页的生命周期有关,因为基页的控件在那时还没有实例化。

我该怎么做?

编辑

下面是异常的堆栈跟踪。你什么也没说。

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:  

如何从子页面's Page_Load中为基页元素赋值

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

看一下ASP。. NET页面生命周期概述-生命周期事件,如果你还没有。正如你所看到的,它应该Page_Load中工作,我没有真正看到问题是什么。尝试将事件移动到页面生命周期稍后的事件中,例如LoadComplete事件。

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

作为基础.aspx页不被继承,在设计器中添加的任何控件都不会初始化。我真的不明白它是如何工作的,虽然(Page_Init被调用,但如何页面决定不初始化其控件是一个谜)有人能解释这一点吗?

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

如果我错了,请告诉我。

编辑

是的,我实现了我需要做的使用母版页而不是.aspx页继承。没有任何问题。

公立小学

我确实找到了一种方法来继承一个。aspx页面有标记在基页这里:http://www.codeproject.com/KB/aspnet/page_templates.aspx但它看起来像完整的黑客对我来说。

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

基页:

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)
}

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