簡體   English   中英

如何從子頁面的Page_Load中分配基頁元素的值?

[英]How to assign a value of base page element from child page's Page_Load?

我可能不是第一個遇到這個問題的人,但我找不到這樣的問題和解決方案。

我有一個基本.aspx頁面和子頁面,它繼承自基頁。 從child的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:  

你是對的,當基頁控件未初始化時會發生這種情況。

如果您還沒有,請查看ASP.NET頁面生命周期概述 - 生命周期事件 正如你所看到的,它應該Page_Load工作,我真的不知道問題是什么。 嘗試稍后在頁面生命周期中將事件移動到事件,例如LoadComplete事件。

好吧,看起來當一個人繼承.aspx頁面時,它只是后面的代碼被繼承。 標記(.aspx本身)不是繼承的,並且沒有辦法(如Master頁面中的ContentPlaceHolder)定義想要在結果頁面上的元素(來自派生,基頁或兩者)。

由於基礎.aspx頁面未被繼承,因此在設計器中未初始化時未添加任何控件。 我真的不明白它是如何工作的(調用了Page_Init,但是頁面決定不初始化它的控件是一種迷惑)有人可以解釋這一點嗎?

我可能不得不使用母版頁來實現我的目標,但我將繼續我的研究並更新我的問題。

如果我在某個地方弄錯了,請告訴我。

編輯

是的,我使用Master頁面而不是.aspx頁面繼承實現了我需要做的事情。 那里沒有任何問題。

PS

我確實找到了一種方法來繼承一個在基頁中有標記的.aspx頁面: http//www.codeproject.com/KB/aspnet/page_templates.aspx但它對我來說似乎是完全的hackery。

我不確定這是否適用於您的問題,但您可以創建一個類並讓兩個頁面都從相同的類繼承,而這些類將繼承自基本的System.Web.UI.Page 您可以將共享方法放在新類中,並且可以從兩個頁面訪問它。

有些東西似乎不對,但如果是這種情況,你可以嘗試在初始化控件時在基頁上創建一個事件處理程序:

在基頁中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM