2009-06-22 6 views

Respuesta

55
this.Page 

o desde cualquier lugar:

Page page = HttpContext.Current.Handler as Page 
7

puede utilizar la propiedad Parent

si necesita este para encontrar un control de la página, puede utilizar

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

No puedo pensar en ninguna buena razón para que un control de usuario sepa nada sobre la página en la que está puesto ya que el control del usuario debe ser ignorante de su contexto y se comporta de forma predecible independientemente de la página en la que se encuentre.

Dicho esto, puede usar this.Page.

+0

este es un gran punto. los controles de usuario bien definidos deben ser completamente independientes de la página en la que se encuentran. – jtate

+4

Si la aplicación en cuestión es una aplicación silo y todas las páginas heredan de una clase BasePage y necesita acceder a esa BasePage, entonces this.Page es una solución completamente aceptable ya que todas las páginas en esa aplicación heredarán de esa BasePage y Control se definirá únicamente para esa aplicación. – cavillac

+1

Un buen caso de uso para esto es acceder a la colección Page.Items, que se puede usar para almacenar objetos que se utilizan durante el ciclo de vida del ciclo de procesamiento de la página Asp.net. Puede evitar volver a cargar objetos comunes en cada control de usuario. – humbads

0

Cada control tiene una propiedad principal que puede usar para acceder al elemento primario.

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

EDIT: depende de lo que uno de los eventos del ciclo de vida de la página que desea almacenar la referencia y qué uso para almacenar esa referencia. Sin embargo, la referencia está siempre disponible

2

Siempre he usado this.Page en System.Web.UI.UserControl.

O siempre puede hacer una llamada recursiva en el Padre hasta que encuentre un objeto que es una Página.

tipo de exageración, aunque ...

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

    return GetParentPage(this.Parent); 
} 
+0

Esto puede causar 'StackOverFlowException' ... – Moumit

2

he encontrado la manera de hacer esto es crear una interfaz, poner en práctica esa interfaz, utilice this.Page para obtener la página del control, echarlo a la interfaz, luego llama al método.

1

Debe utilizar NamingContainer así:

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

     } 
0

Crear un delegado en el control de usuario y luego asignarle un método desde la página principal.

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 
    } 
} 
Cuestiones relacionadas