2012-06-19 11 views
6

Ich habe versucht, einige nicht-Test-Code zu erstellen, indem Sie eine dritte Teildatei zusätzlich zu MyPage.aspx und MyPage.aspx.cs und MyPage.aspx.designer.cs erstellen. Ich meine dritte Datei MyPage.aspx.TEST.csWarum kann ein Ereignis nicht registriert werden, wenn es Teil einer dritten Teildatei in ASP.NET ist?

genannt

In der Teildatei MyPage.aspx.TEST.cs schrieb ich folgendes:

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

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

Der Code kompiliert und ich dann decompile den Code und Da ist es, ich kann die OnInit-Überschreibung und die RunTest-Methode sehen.

Aber wenn ich die Seite ausführen, wird das Ereignis nicht registriert noch ausgeführt, noch kann ich einen Haltepunkt festlegen.

Ich verschiebe diesen Code aus der Teilklasse MyPage.aspx.TEST.cs in die Teildatei MyPage.aspx.cs und die Ereignisregister und wird ausgeführt. Fremder, wenn ich die Assembly dekompiliere und ein Diff mache, scheint die Klasse in denselben Code zu dekompilieren.

Mögliche Hinweise, die in keinem Zusammenhang sein kann:

  • Die Seite verwendet AutoEventWireup = „true“ (ich immer noch das gleiche Verhalten, wenn ich versuche, die Veranstaltung auf meine Page_LoadComplete registrieren)
  • Die Anwendung ein Web ist Anwendung (ieuses eine proj-Datei)
  • Die Teildatei kompiliert (und wenn ich Fehler in die Teildatei einführen, wird es die Kompilierung verhindern, so dass ich sicher weiß, dass die Teildatei kompiliert wird)
  • Ich bekomme das gleiche Ergebnis mit verschiedenen Ereignissen (PreRen die, etc)
+0

Bloody ausgezeichnete Frage, und ich habe nicht die nebeligste. – jcolebrand

+0

Haben Sie überprüft, dass Ihre Klassennamen und Namespaces in allen drei partiellen Klassendateien identisch sind? – StriplingWarrior

+0

Ich habe das Problem gefunden, es hat mit der Direktive zu tun - wenn es codeFile = "foo.cs" heißt, kompiliert es nur die zwei Dateien. Wenn es CodeBehind sagt "verhält es sich so, wie es Jupaol gezeigt hat, sollte es. – MatthewMartin

Antwort

2

Das ist seltsam, ich habe gerade das gleiche Experiment und alle Ereignisse ausgelöst werden, ich habe die gleichen Bedingungen, Web-Anwendung, AutoEventWireup = true

Sind Sie von einer anderen Basis vererben Seite?

Das ist mein Teil-Klasse:

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); 
    } 
} 

Alle Ereignisse funktioniert, wenn ich Kommentar- die //throw new NotImplementedException(); ich die Ausnahme erhalten, wie erwartet.

Versuchen Sie Folgendes:

  • Stellen Sie sicher, den Namen Ihrer Teil-Seite Klassen sind die gleichen
  • Try Page.LoadComplete += RunTest;-this.LoadComplete += RunTest;
  • Vergewissern Sie sich die Antwort der Seite beendet werden, nicht zu ändern, wenn eine Ausnahme tritt auf
  • Wenn Sie ein benutzerdefiniertes HTTP-Modul haben, versuchen Sie, es zu deaktivieren, könnte es die Ereignisse irgendwie stören
+1

Ich habe das Problem gefunden, es hat mit der Direktive zu tun- wenn es CodeFile =" foo heißt.cs "es kompiliert nur die beiden Dateien. Wenn es codeBehind sagt" verhält es sich so, wie es Jupaol gezeigt hat. Danke, dass du bewiesen hast, dass das Konzept funktioniert, nachdem ich deinen Konzeptnachweis hatte, habe ich einfach einen Codevergleich durchgeführt, bis ich herausgefunden habe, was anders ist. – MatthewMartin

+0

Ohh das ist ein guter Fang. – Jupaol

Verwandte Themen