2009-06-22 19 views

回答

55
this.Page 

或從任何地方:

Page page = HttpContext.Current.Handler as Page 
7

你可以,如果你需要用它來找到網頁上的控制,那麼你可以使用使用Parent屬性

Label lbl_Test = (Label)Parent.FindControl("lbl_Test"); 
11

我想不出有什麼好的理由讓用戶控件知道它所在頁面的任何內容,因爲用戶控件應該是無視它的上下文,並且無論它在哪個頁面上都可預測地行爲。

這就是說,你可以使用this.Page

+0

這是一個很好的觀點。明確定義的用戶控件應該完全獨立於他們所在的頁面。 – jtate 2014-04-25 14:15:09

+4

如果有問題的應用程序是孤島應用程序,並且所有頁面都從BasePage類繼承,並且您需要訪問該BasePage,則this.Page是完全可接受的解決方案,因爲該應用程序中的所有頁面都將從該BasePage和控件將僅爲該應用定義。 – cavillac 2014-10-29 14:17:36

+1

一個很好的用例就是訪問Page.Items集合,該集合可用於存儲用於Asp.net頁面處理週期的生命週期的對象。您可以避免在每個用戶控件中重新加載公用對象。 – humbads 2016-09-16 14:42:55

0

每個控件都有一個父屬性,您可以使用它來訪問父項。

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write(this.Parent.ID); 
} 

編輯: 取決於所要存儲的參考和使用什麼來存儲參考頁面生命週期事件之一。然而,參考始終可用

2

我總是在System.Web.UI.UserControl中使用this.Page。

或者你總是可以對父進行遞歸調用,直到你遇到一個對象是一個頁面。

一種矯枉過正,但...

protected Page GetParentPage(Control control) 
{ 
    if (this.Parent is Page) 
     return (Page)this.Parent; 

    return GetParentPage(this.Parent); 
} 
+0

這可能會導致StackOverFlowException ... – Moumit 2013-12-17 10:58:26

2

,我發現這樣做的方法是創建一個接口,實現該接口,使用this.Page從控制得到的頁面,將其轉換爲界面,然後調用該方法。

1

您必須使用NamingContainer這樣的:

 try 
     { 
      if (!string.IsNullOrWhiteSpace(TargetCtrlID)) 
      { 
       var ctrl = NamingContainer.FindControl(TargetCtrlID); 
       if(ctrl != null) 
        Console.Write("'" + ctrl.ClientID + "'"); 
      } 
     } 
     catch 
     { 

     } 
0

創建用戶控制的委託,然後分配給它從父頁面的方法。

class MyUserControl : UserControl 
{ 
    delegate object MyDelegate(object arg1, object arg2, object argN); 
    public MyDelegate MyPageMethod; 

    public void InvokeDelegate(object arg1, object arg2, object argN) 
    { 
    if(MyDelegate != null) 
     MyDelegate(arg1, arg2, argN); //Or you can leave it without the check 
             //so it can throw an exception at you. 
    } 
} 

class MyPageUsingControl : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    if(!Page.IsPostBack) 
     MyUserContorlInstance.MyPageMethod = PageMethod; 
    } 

    public object PageMethod(object arg1, object arg2, object argN) 
    { 
    //The actions I want 
    } 
} 
相關問題