|
|

如何在 page 裡存取 masterpage 中usercontrol 的屬性
By Allen Kuo, 建立日期:2012/01/09 13:34 ,最後修改日期:2012/01/09 14:43
...
|
加入書籤:
|
藍色小舖裡有一則提問
在MasterPage 上有一個Class 為MySelector 的UserControl其ID 為MySelector1, 現在我要在子網頁上引用MasterPage上的MySelector1,我使用的
mySel = (UserControl)this.Master.FindControl("MySelector1");
但這樣做,並不能設定MySelector 的所有屬性,但如果用
mySel = (MySelector)this.Master.FindControl("MySelector1");
程式又回應 不認得MySelector, 請問要如何讓我的子網頁也認得這個UserControl 的Class 呢?
我在之前有寫過一篇, 如果看懂應該就可以寫得出來才對。
針對這個問題,我們應該這麼思考:
- 網頁套用 MasterPage 主要是方便讓多個網頁能有相同的版型; 但其實 page 也可以 runtime 套用其他版型, 或在 vs.net 裡直接修改成套用其他 masterpage, 所以 page 裡其實本來就不應該想要去控制 MasterPage 裡的控制項, 因為哪天換了 MasterPage 也許程式就發生錯誤。
- 沿續上述的思考觀點, 在 page 裡更不應該使用 FindControl("MySelector1"), 因為不同的 MasterPage 也許會為將這個 user control 取不同的名稱, 屆時你的 page 豈不是要根據 masterpage 的不同而變動不同 id ?
所以, 遇到這類問題, 我的思考邏輯會是
- Page 只面對 MasterPage, 告訴 MasterPage "我想傳XX值,至於你要轉交給誰,我不管; 或者我想取得XX值, 請你給我,至於你要向哪個 control 索取, 我不在乎"
- MasterPage 要向哪一個 user control 索取資訊, 或傳值給什麼 user control, 是 MasterPage 的責任, Page 不必明白
所以, 我的做法會是
- 先設計一個 interface, 裡面定義了存取值的 method or property
- 要求 MasterPage 實作上述 interface
- 在 Page 裡將 MasterPage 轉型成該 interface, 並叫用它的 method or property
- 至於 MasterPage 要將資訊傳給什麼控制項, Page 並不必理會, 因為那是 MasterPage 應該負責的事情
回應
|
|
|