2011-11-30 172 views
0

我的asp.net應用程序具有從其他用戶控件繼承的自定義基本用戶控件。此自定義基本用戶控件具有已公開的三個屬性。當用戶控件加載時,自定義的基本用戶控件屬性爲空。我試圖弄清楚我做錯了什麼。有人可以幫忙找出我失蹤的步驟嗎?從父頁從子用戶控件訪問基本用戶控件屬性

定製基本用戶控制加載代碼:後面的用戶控制的

public partial class webonlinecustombase : System.Web.UI.UserControl 
{ 
    public Event Event { get; set; } 
    public OnlineSystemPageCustom custompage { get; set; } 
    public OnlineSystemPageCustom.OnlineSystemPageHdr.OnlineSystemPageModule custommodule { get; set; } 

    public void Page_Load(object sender, EventArgs e) 
    { 
     string typeName = custommodule.ModuleInternetFile; 
     inpagelink.HRef = "#" + custommodule.ModuleName.Replace(" ", "").Replace("/", ""); 
     modtitle.InnerText = custommodule.ModuleName; 
     Type child = Type.GetType(typeName); 

     UserControl ctl = (UserControl)Page.LoadControl(child, null); 
     if (ctl != null) 
     { 
      this.modsection.Controls.Add(ctl); 
     } 
    } 
} 

示例代碼

private void Render_Modules() 
    { 
     foreach (OnlineSystemPageCustom.OnlineSystemPageHdr.OnlineSystemPageModule item in custompage.Header.Modules) 
     { 
      if (item.ModuleCustomOrder != 99) 
      { 
       webonlinecustombase ctl = (webonlinecustombase)Page.LoadControl("../IPAM_Controls/webtemplatecontrols/webonlinecustombase.ascx"); 
       ctl.Event = Event; 
       ctl.custompage = custompage; 
       ctl.custommodule = item; 
       this.eventprogrammodules.Controls.Add(ctl); 
      } 
     } 
    } 

定製基本用戶控制代碼繼承基本用戶控制

public partial class eventscientificoverview : webonlinecustombase 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (custommodule.ModuleDefaultVerbiage != null && custommodule.ModuleDefaultVerbiage != "") { this.Load_Verbiage(false); } 
     else if (custommodule.ModuleCustomVerbiage != null && custommodule.ModuleCustomVerbiage != "") { this.Load_Verbiage(true); } 
    } 

    protected void Load_Verbiage(bool usecustom) 
    { 
     if (usecustom) { this.scientificoverviewverbiage.InnerHtml = custommodule.ModuleCustomVerbiage; } 
     else { this.scientificoverviewverbiage.InnerHtml = custommodule.ModuleDefaultVerbiage; } 
    } 
} 

回答

1

您必須在父頁面的init事件中調用Render_Modules。

此外,您可能希望重構基類/自定義類以避免事件執行順序混淆,因爲加載事件將在基類和自定義類中觸發。當我們有這種類型的結構時,我們總是在基類中實現一個OnLoad方法,以供繼承者覆蓋。通過這種方式,我們可以準確控制何時在繼承器中執行加載邏輯。

帶有附加信息的

這裏更新是關於如何處理基地和子類加載事件的一些附加信息。

在webonlinecustombase,添加以下內容:

protected virtual void OnPageLoad() { 
} 

然後修改您的頁面加載事件調用在適當的時候這種新方法:

public void Page_Load(object sender, EventArgs e) 
{ 
    string typeName = custommodule.ModuleInternetFile; 
    inpagelink.HRef = "#" + custommodule.ModuleName.Replace(" ", "").Replace("/", ""); 
    modtitle.InnerText = custommodule.ModuleName; 
    Type child = Type.GetType(typeName); 

    UserControl ctl = (UserControl)Page.LoadControl(child, null); 
    if (ctl != null) 
    { 
     this.modsection.Controls.Add(ctl); 
    } 

    // Now let the inheritors execute their code 
    OnPageLoad(); 
} 

然後,在你的繼承類,更改:

protected void Page_Load(object sender, EventArgs e) 

protected override void OnPageLoad() 

當我在回顧這段代碼時,我發現你也在webonlinecustombase中動態加載控件。您需要將控件加載到init事件中才能使它們在標準頁面邏輯中正常工作。

+0

好吧,這是所有可以理解的,不太確定的OnLoad方法我明白它,但不知道如何去做。 – mattgcon

+0

@mattgcon:更新了有關如何實施OnLoad和其他發現的信息。 –

+0

我將Render_Modules放置在父頁面的Page_Init事件中,但屬性仍然在繼承基本用戶控件的控件中引用null – mattgcon

0

你試過基地嗎?[PropertyName]?

如果在派生類中有新的關鍵字或重寫,並且只有基類中的值可能是罪魁禍首。這發生在我以前。

相關問題