2010-02-26 23 views
9

tengo el siguiente código en mi lado ASPX:ASP.Net Cambio MasterPage programación

<%@ Page Language="C#" MasterPageFile="~/masterpages/standard.Master" .... %> 
<%@ MasterType VirtualPath="~/masterpages/standard.Master" %> 

utilizo el rutaDeAccesoVirtual para acceder a las propiedades en mi MasterPage. Hasta ahora, muy bien.

Sin embargo, ahora tengo que cambiar las páginas maestras programáticamente. sé que para cambiar una página maestra, que tengo que hacer en el Page_Init:

Page.MasterPageFile = "~/masterpages/myNewMasterPage.Master"; 

Pero no tengo ni idea, de cómo cambiar el rutaDeAccesoVirtual.

Respuesta

2

que asumen que está utilizando MasterType porque necesita alguna propiedad (que también tendría si cambiara a otro maestro), digamos que está utilizando actualmente Master.MyButton, mover esto en una clase base y el uso de ese tipo en su declaración @MasterType:

public class MasterBase : MasterPage 
{ 
    public Button MyButton; 
} 

public class standard : MasterBase 
{ 
} 

en su página, su declaración MasterType parece:

<%@ MasterType TypeName="MyNameSpace.MasterBase" %> 

Ahora cuando cambie su ruta virtual, no importa, está accediendo a propiedades en la base, lo mismo para ambas páginas maestras.

0

hecho un poco de excavación y encontramos este en los foros de ASP.NET:

Para cambiar el MasterType dinámicamente, se debe crear una base de masterpage clase y que cada masterpage a hereda de ella.

Luego puede utilizar ese tipo base MasterPage como un MasterType para su página.

ver la sección "Páginas fuertes de mecanografía para el maestro dinámico " en este link.

Saludos,

Anas Ghanem

que parece ser un enfoque bastante razonable, siempre y cuando se puede vivir con hacer un poco de fundición.

Source


Si desea ahorrar algo de tiempo y no tener que hacer la colada en cada llamada se podría definir un campo en su base de tipo MasterPage llamada 'CurrentMaster' o algo por el estilo y luego use un condicional en el archivo MasterPage actual que también establece el 'CurrentMaster' con el tipo apropiado.

MasterPage CurrentMaster; 
if (Page.MasterPageFile == "Master1") { 
    CurrentMaster = (Master1Type)Page.MasterPage; 
} 
else { 
    CurrentMaster = (Master2Type)Page.MasterPage; 
} 

Source

2

Para decirlo brevemente, no puedes hacer eso.

Como ve, el directorio "MasterType" proporciona tipo información, que el compilador usa en tiempo de compilación.

Cuando escribe algo como Page.MasterPage.btn1.Text = "abcd", el compilador necesita saber cómo manejar esa parte "btn1". ¿Qué es? Es un campo? ¿Una propiedad? ¿Un método? Una clase anidada? O tal vez no existe en absoluto? Para responder a estas preguntas, el compilador necesita saber tipo de la expresión Page.MasterPage. Y eso es exactamente lo que usted proporciona con la directiva "MasterType".

El atributo VirtualPath básicamente dice "ir a compilar ese otro archivo primero, y el resultado de su compilación será el tipo de propiedad maestra de esta página". Así es como el compilador sabe.

De todo lo anterior, se puede sacar una conclusión: no solo es imposible cambiar el tipo de alguna propiedad en tiempo de ejecución, sino que tampoco tiene ningún sentido: el código ya se ha compilado, no se puede ¡necesita más información en tiempo de compilación!

Así que la siguiente pregunta que surge es: ¿por qué querías hacer esto en primer lugar?

Si solo desea utilizar diferentes propiedades que están declaradas en diferentes páginas maestras, puede seguir los consejos de Nick Craver y Nathan Taylor y declarar una clase base que tendría todos esos campos/propiedades y heredaría todas sus páginas maestras de esa clase base, y luego haga que su directiva MasterType especifique esa clase base a través del atributo TypeName.

Sin embargo, yo solo iría de esta manera si ambas páginas maestras son similares en lógica, solo diferentes en diseño. Es decir, una página no debería tener ninguna propiedad que la otra no tenga. De lo contrario, simplemente no es correcto tener dos subconjuntos de propiedades/métodos/campos en una clase (que será la clase base) cuando solo se usa uno de esos subconjuntos en cualquier momento. Y no es correcto crear una base común para dos clases cuando en realidad no existe una base común. Aka "mal diseño". En este caso, probablemente debería reconsiderar su diseño inicial.

Si su propósito es otro - por favor explique, y trataré de encontrar algunas soluciones para usted.

Buena suerte con eso.

  • Fyodor
+0

Althoght que han dado una respuesta agradable que no era la solución. Pero dado que es muy útil para otros visitantes, voy a marcarlo como Userfull. :) – Marco

+0

No es una solución, porque no hay ninguna. :-) Y en mi respuesta, intento explicar cuidadosamente por qué. –

Cuestiones relacionadas