2009-09-18 9 views

Respuesta

7

Niels,

apalancamiento reflexión (según lo sugerido por JDunkerley) es una aproximación al problema. Otro que podría considerar es implementar una interfaz:

  1. Cree una interfaz que incluya su método.
  2. Implemente la interfaz en su página maestra
  3. Desde su control, consulte this.Page.Master a través del tipo de interfaz.
  4. Llame a su método.

Este es un mejor enfoque OO, conduce a menos acoplamiento, y sin duda tendrá un mejor rendimiento que la reflexión en tiempo de ejecución.

Espero que esto ayude!

+0

¡Utilicé este enfoque y funcionó bien! Gracias –

+0

¡Me alegro de ser de ayuda! Feliz codificación :-) –

12

Usted tiene que emitir el this.Page.Master por primera vez como la propiedad Master de la página es de tipo System.Web.UI.MasterPage.

por ejemplo

((MyMaster)this.Page.Master).MyFunction(); 

Se puede comprobar el tipo de la página maestra subyacente mediante la adición de una propiedad para el código detrás del control de usuario:

public string MType 
    { 
     get { return this.Page.Master.GetType().FullName; } 
    } 

e imprima el resultado en el marcado de control de usuario, p. añadir esta línea a hacer que imprima como un comentario en el código fuente:

<!-- <%= MType %> //--> 
+0

Me sale un error al decir que no puede encontrar el tipo o el espacio de nombres _Master ?? –

+0

puede intentar comprobar el tipo de página maestra en RunTime. Actualizará la respuesta en un segundo – JDunkerley

+0

El tipo es ASP.masterpage_master pero no está disponible en tiempo de compilación. –

4

Usted está couppling su código muy thighly si se llama a una función en el masterpage desde dentro de su control de usuario.

El control solo se puede usar en páginas basadas en ese maestro. Creo que esto suele ser un mal diseño, y violará al menos la ley de Demeter.

¿Qué es exactamente lo que quiere lograr en su control?

1

JDunkerley lo tiene todo. Pero permítame explicarle cómo desacoplarlo utilizando MVP para que pueda trabajar para evitar el problema del diseño del que habla Heiko Hatzfeld.

Básicamente, implemente el patrón MVP tanto para su control como para su página maestra. Consulte here para obtener instrucciones sobre cómo hacerlo. Declare el método que desea llamar en la interfaz del maestro (IMasterView). Luego crea una clase que controlará la relación entre los dos componentes; lo llamaremos la clase PageController. Coloque una instancia de esta clase en estado de solicitud para cada solicitud agregando la siguiente línea a global.asax.cs:

/* global.asax.cs */ 
protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    // ... 
    HttpContext.Current.Items["Controller"] = new PageController(); 
    // ... 
} 

entonces Puede acceder a este ejemplo de cada uno de los presentadores (master y de control) a través de la siguiente línea de código:

var controller = HttpContext.Current.Items["Controller"] as PageController; 

A continuación, puede aplicar un evento o algún otro mecanismo para Permitir que el control invoque el método en el maestro de una manera desacoplada a través de este objeto compartido. Por ejemplo:

/* PageController.cs */ 
public event EventHandler SomeEvent; 

protected virtual void OnSomeEvent(EventArgs e) 
{ 
    Debug.Assert(null != e); 

    var handler = this.SomeEvent; 
    if (null != handler) 
     handler(this, e); 
} 

public void FireSomeEvent() 
{ 
    this.OnSomeEvent(EventArgs.Empty); 
} 

/* ControlPresenter.cs */ 
public ControlPresenter(IControlView view) 
    : base() 
{ 
    view.EventFired += (sender, e) => 
    { 
     var controller = HttpContext.Current.Items["Controller"] as PageController; 
     controller.FireSomeEvent(); 
    }; 
} 

/* MasterPresenter.cs */ 
public MasterPresenter (IMasterView view) 
    : base() 
{ 
    var controller = HttpContext.Current.Items["Controller"] as PageController; 
    controller.SomeEvent += (sender, e) => view.MyFunction(); 
} 

Asegúrese de que el evento "EventFired" se declara en la interfaz de su control (IControlView) e implementada en el control. Luego, todo lo que tiene que hacer para afectar al maestro (llame a su método), desencadena este evento y MVP + el PageContoller se encargará del resto.

Saludos

1

no pude conseguir las respuestas anteriores al trabajo, así que aquí es lo que funcionó para mí:

desea hacer referencia a una propiedad de la página principal de un control de usuario.

En primer lugar, la página principal tendrá una propiedad pública, así:

public string BodyClass 
{ 
    set 
    { 
     this.masterBody.Attributes.Add("class", value); 
    } 
} 

Ahora añadir una referencia a la página maestra en el archivo ASCX control de usuario, así:

<%@ Register Src="~/Source/MasterPages/Main.master" TagPrefix="MSTR" TagName="MasterPage" %> 

Luego, en el código detrás (C# en mi caso) tiene este código:

Main masterPage = (Main)this.Page.Master; 
masterPage.BodyClass = "container"; 

Sin la referencia a la página maestra de arriba, su control de usuario no podrá encontrar la clase de página maestra.

Cuestiones relacionadas