2012-06-19 3 views
6

Estaba intentando agregar algún código de prueba que no sea de producción creando un tercer archivo parcial además de MyPage.aspx y MyPage.aspx.cs y MyPage.aspx.designer.cs. Llamé a mis terceros MyPage.aspx.TEST.cs archivos¿Por qué un evento no se puede registrar cuando forma parte de un tercer archivo parcial en ASP.NET?

En los MyPage.aspx.TEST.cs de archivos parciales, escribí lo siguiente:

protected override void OnInit(EventArgs e) 
{ 
    Page.LoadComplete += RunTest; 
    base.OnInit(e); 
} 
//Assert. 

public void RunTest(object sender, EventArgs e) 
{ 
    //Clever assertions 
} 

El código se compila y luego descompilar el código y allí está, puedo ver la anulación de OnInit y el método RunTest.

Pero cuando ejecuto la página, el evento no se registra, ni se ejecuta, ni puedo establecer un punto de interrupción.

Muevo ese código fuera de la clase parcial MyPage.aspx.TEST.cs en el archivo parcial MyPage.aspx.cs y el evento se registra y se ejecuta. Extraño, cuando descompilo el ensamblado y hago un diff, la clase parece descompilarse en el mismo código.

pistas posibles que pueden no estar relacionadas:

  • la página utiliza AutoEventWireup = "true" (sigo teniendo el mismo comportamiento si intento registrar mi caso mi Page_LoadComplete)
  • La aplicación es una web aplicación (es decir, utiliza un archivo de proyecto)
  • El archivo parcial se compila (y si introduzco errores en el archivo parcial, evitará la compilación, por lo que estoy seguro de que el archivo parcial sí se compila)
  • Me sale el mismo resultado usando diferentes eventos (PreRen der, etc.)
+0

Excelente pregunta sangrienta y no tengo la menor idea. – jcolebrand

+0

¿Ha comprobado que los nombres de clase y los espacios de nombres son exactamente los mismos en los tres archivos de clase parcial? – StriplingWarrior

+0

Encontré el problema, tiene que ver con la directiva, si dice codeFile = "foo.cs" compila solo los dos archivos. Si dice codeBehind "se comporta como Jupaol demostró que debería. – MatthewMartin

Respuesta

2

Esto es extraño, acabo de hacer el mismo experimento y todos los acontecimientos están siendo despedidos, tengo las mismas condiciones, aplicaciones web, AutoEventWireup = true

¿Estás heredando de otra base ¿página?

Ésta es mi clase parcial:

public partial class _Default 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     this.LoadComplete += RunTest; 
     this.Load += new EventHandler(_Default_Load); 
     base.OnInit(e); 
    } 

    void _Default_Load(object sender, EventArgs e) 
    { 
     //throw new NotImplementedException(); 
    } 

    void RunTest(object sender, EventArgs e) 
    { 
     //throw new NotImplementedException(); 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     this.Response.Write("omfgggg"); 
     this.lblMyMessageTest.Text = "omfg2"; 
     base.OnPreRender(e); 
    } 
} 

Todos los eventos de obras, si yo elimine el comentario //throw new NotImplementedException(); tengo la excepción como se esperaba.

intente lo siguiente:

  • Asegúrese de que el nombre de sus clases de página parciales son los mismos
  • tratar de cambiar Page.LoadComplete += RunTest; a this.LoadComplete += RunTest;
  • Asegúrese de que no se da por concluida la respuesta de la página cuando una excepción ocurre
  • Si tiene un módulo HTTP personalizado, intente deshabilitarlo, podría estar interfiriendo con los eventos de alguna manera
+1

Encontré el problema, tiene que ver con la directiva, si dice codeFile =" foo.cs "compila solo los dos archivos. Si dice codeBehind" se comporta como Jupaol lo demostró. Gracias por probar que el concepto funciona, una vez que tuve tu prueba de concepto, simplemente hice una comparación de código hasta que encontré lo que era diferente. – MatthewMartin

+0

Ohh eso es una buena captura. – Jupaol

Cuestiones relacionadas