我可能不是第一个遇到这个问题的人,但我找不到这样的问题和解决方案。
我有一个基本.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:
答案 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)
}