如何从子页面'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:
你是对的,当基页控件没有初始化时,就会发生这种情况。
看一下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
继承。您可以将共享方法放在新类中,并且可以从两个页面访问它。