Pregunta

Quiero obtener un tipo de " BasePage " Objeto que estoy creando. Cada objeto de página se basa en BasePage. Por ejemplo, tengo un Login.aspx y en mi código subyacente y una clase que tiene un método Display:

Display(BasePage page) {
    ResourceManager manager = new ResourceManager(page.GetType());
}

En la estructura de mi proyecto tengo un archivo de recursos predeterminado y un archivo de recursos de traducción psuedo. Si configuro intentar algo como esto:

Display(BasePage page) {
    ResourceManager manager = new ResourceManager(typeof(Login));
}

devuelve la página traducida. Después de algunas investigaciones, encontré que page.GetType (). ToString () devolvió algo al efecto de " ASP_login.aspx " ¿Cómo puedo obtener el código real detrás del tipo de clase, de manera que obtenga un objeto de tipo " Inicio de sesión " que se deriva de " BasePage " ;?

Gracias de antemano!

¿Fue útil?

Solución

Si su código al lado se ve así:

public partial class _Login : BasePage 
 { /* ... */ 
 }

Luego obtendrías el objeto Type con typeof(_Login) . Para obtener el tipo dinámicamente, puede encontrarlo recursivamente:

Type GetCodeBehindType()
 { return getCodeBehindTypeRecursive(this.GetType());
 }

Type getCodeBehindTypeRecursive(Type t)
 { var baseType = t.BaseType;
   if (baseType == typeof(BasePage)) return t;
   else return getCodeBehindTypeRecursive(baseType);
 }

Otros consejos

Después de una investigación adicional, encontré que si llamo a Page.GetType (). BaseType, devuelve el tipo de código subyacente de la página Aspx.

page.GetType (). BaseType, se ha dicho antes, pero permítanme explicar por qué.

Las páginas Aspx heredan de sus páginas de código subyacente, lo que significa que la jerarquía de herencia se ve así:

...
Page
BasePage
Login
ASP_Login

Donde la parte superior es el padre y la parte inferior es el niño.

Esto permite que se pueda acceder a su código detrás desde la página aspx, sin que sea necesario copiar todo el código generado relacionado con su página aspx real en la página de la clase base.

Depende de dónde esté llamando Display () desde. Si lo está llamando desde el ASPX, entonces se mostrará " ASP_login.aspx " Si lo llama desde el código subyacente (es decir, el método Page_Load ()), debe obtener el tipo de página de inicio de sesión.

En lugar de pasar la página, puede considerar simplemente usar la propiedad de la página (es decir, esta.Página.GetType ()), que siempre debería ser el tipo de página / código actual, si recuerdo correctamente.

También debería señalar que podría considerar mudar este tipo de cosas fuera del ASPX / codebehind a algún tipo de servicio. En general, es una buena idea minimizar la cantidad de cosas que hace en un código detrás y, en su lugar, insertar la lógica en una clase de presentador y seguir el patrón de MVP para el desarrollo de formularios web ASP.NET.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top