2010-06-07 92 views
2

我有一個Web站點項目,並在其中有一個用戶Web控件定義在一個ascx文件中。在.master控制類型中找不到子控件頁面中的Web控件

該控件被添加到Site.Master中,並且它在頁面上正確顯示並且一切正常。

我需要覆蓋派生自Site.Master的其中一個頁面上的某些控件的字段。

// In OnLoad: 
MyControlName control = (MyControlName) Page.Master.GetBaseMasterPage().FindControl("controlID")); 

問題是MyControlName未在子頁面上註冊爲有效類型。如果我直接向子頁面添加第二個控件實例,上面的工作將根據需要進行,但如果控件不是直接放在頁面上,而是僅在母版頁中定義,則該類型是未定義的。該控件不在名稱空間中,並在項目中定義,所以我不知道爲什麼它有這樣的問題位置適當的類型。

如果我在OnLoad中放置了一個斷點,那麼爲控件列出的類型是ASP.my_control_name_ascx,但使用它也不起作用。

爲什麼孩子類不能引用正確的類型?我能解決這個問題嗎?

謝謝!

回答

0

我接受GetBaseMasterPage()是你自己的方法嗎?如果嘗試:

MyControlName control = (MyControlName)Page.Master.FindControl("controlId"); 

+0

是的,這是我們自己的功能。我們有一個網站的主人,和科大師。並非所有節主都必須從網站主控繼承,所以該功能只能運行到「最高」主頁面。 如果在頁面上放置了控件的第二個實例,則該代碼正常工作。即它將控件定位在主控件上並更新主控頁面控件的狀態,但只有當子頁面上有控件的實例時纔會這樣。否則,編譯器會說這是一個未知的類型。所以這只是一個類型解析問題,而不是功能問題。 – turtle 2010-06-07 17:59:13

+0

關於該代碼示例的快速(迂腐)點;你需要支持Page.Master來獲取類型轉換:MyControlName control =((MyControlName)Page.Master).FindControl(「controlId」); – 2010-10-12 14:15:27

+0

我不明白爲什麼,Page.Master是MasterPage類型的屬性,它繼承自Control,它具有FindControl方法。您只需要投射結果,這是FindControl方法的結果,您不需要進一步括號。 – 2010-10-12 14:54:04

1

控件在整個項目中沒有全局範圍。它只能在控件註冊的頁面上選擇。所以,你必須註冊子頁面上的控制:

<%@ Register src="WebUserControl.ascx" tagname="WebUserControl" tagprefix="uc1" %> 

你需要像上面添加一個寄存器標記你的孩子aspx頁面的頂部。

另一種選擇是你可以爲控件創建一個接口,它暴露你想要訪問的屬性或方法,並將接口放在app_code或其他全局可訪問的位置,然後讓控件實現接口並投射控制界面。

0

不直接回答你的問題,但你可能會發現@MasterType directive有用。

如果添加喜歡

<%@ MasterType TypeName="ClientName.SiteName.MasterPages.SiteMaster" %> 

一行到你的ASPX頁面的頂部,你應該能夠引用母版頁中的代碼,而不必強制轉換。這可能會讓代碼更容易找到你的控件,或許?

你可以用一條線落得像:

// In Page.OnLoad: 
MyControlName control = Page.Master.MyControl; 

,然後在您的主頁公開了新的屬性,包裝了FindControl電話:

// In Site.master.cs 
internal MyControlName MyControl 
{ 
    get { this.FindControl("controlID"); } 
} 

希望這有助於!

1

下面的代碼對我的作品:

DropDownList ddlLanguage = (DropDownList)Page.Master.FindControl("ddlLanguage"); 
相關問題