2014-03-31 13 views
6

Ich habe eine asp.net Webforms-Anwendung. Jede einzelne aspx.cs-Klasse muss von BasePage.cs erben, die von System.Web.UI.Page erbt.Wie Exception zu werfen, wenn Klasse falsche Vererbung hat

gewünschte Seite Vererbung:

class MyChildPage : BasePage : System.Web.UI.Page 

Wie kann ich erzwingen, dass, wenn ein neues Kind Seite erstellt wird es von BasePage.cs erbt und System.Web.UI.Page nicht?

Mögliche Lösungen:

  • Gibt es eine Möglichkeit Standard Schaffung einer aspx.cs Seite zu ändern?
  • Gibt es eine Möglichkeit, einen Compilerfehler zu werfen, wenn er von System.Web.UI.Page erbt?

Hinweis: Diese untergeordneten Seiten teilen sich die gleiche Masterseite, so dass dies helfen könnte.

+0

Haben Sie ein Tool wie [** FxCop **] (http://msdn.microsoft.com/en-us/library/bb429476 (v = vs.80) .aspx) in Betracht gezogen? Sie könnten auch einen benutzerdefinierten Build-Schritt haben, um jede Seite zu validieren, erweitert "BasePage". – mellamokb

Antwort

1

Sie können dies mit einem benutzerdefinierten MSBuild-Task implementieren, der alle Seiten überprüft. Hier ist zum Beispiel ein Task, der überprüft, dass nur BasePage von Page erbt. Wenn eine andere Klasse von Page erbt, wird ein Fehler in der Ausgabe protokolliert werden und die Build fehl:

public class CheckBasePage : Task 
{ 
    public override bool Execute() 
    { 
     var assm = Assembly.LoadFile("/path/to/WebsiteAssembly.dll"); 
     var types = assm.GetTypes(); 

     var pages = new List<string>(); 
     foreach (var t in types) 
     { 
      if (t.BaseType == typeof(Page) && t.Name != "BasePage") 
      { 
       pages.Add(t.FullName); 
      } 
     } 

     if (pages.Count > 0) 
     { 
      Log.LogError("The following pages need to inherit from BasePage: [" + string.Join(",", pages) + "]"); 
      return false; 
     } 

     return true; 
    } 
} 

Dann würden Sie diese kundenspezifische Aufgabe als Teil des Build-Prozesses in Ihrer Projektdatei hinzufügen:

<UsingTask TaskName="CheckBasePage" AssemblyFile="/path/to/MyCustomTasksAssembly.dll" /> 

<Target Name="PostBuild"> 
    <CheckBasePage /> 
</Target> 

Nun wird davon ausgegangen, dass MyCustomTasksAssembly ein separates Projekt ist, das Sie zum Verwalten benutzerdefinierter MSBuild-Aufgaben wie diesem erstellen. Wenn Sie die CheckBasePage Aufgabe in das gleiche Projekt wie den Rest des Codes einbetten möchten, müssen Sie die same trick from here anwenden.

+0

Dies verursacht ein Problem.Sobald die Baugruppe geladen ist, wird die Baugruppe nicht entladen. Dies unterbricht den Erstellungsprozess, da die Assembly nicht in das Verzeichnis bin verschoben werden kann, da sie von der Task CheckBasePage verwendet wird. Ich habe versucht, die Assembly in eine andere App-Domäne zu laden (http://msdn.microsoft.com/en-us/library/ms173101.aspx), so dass ich sie entladen konnte, aber dann bekomme ich Datei nicht gefunden Ausnahme, wenn ich versuche, die Datei zu öffnen . Irgendwelche Ideen? – Rafi

+0

Ja, hast du den letzten Absatz gelesen? Ich habe es selbst getestet und konnte es zum Laufen bringen. – mellamokb

+0

Ja danke. Ich wollte es in derselben Versammlung machen. Es stellte sich heraus, dass das Problem darin bestand, dass Sie ein komplexes Objekt nicht innerhalb einer appDomain an eine andere übergeben konnten (Type). Also ändere ich den Code so, dass nur reguläre Objekte übergeben werden und es hat funktioniert. – Rafi

5

Nicht sicher, ob es Ihrer Situation passt, aber Sie die Basisseite für die gesamte Anwendung über web.config-

<system.web> 
    <pages pageBaseType="BasePage" /> 
</system.web> 

Dokumentation auf Msdn angeben: http://msdn.microsoft.com/en-us/library/950xf363(v=vs.85).aspx

+0

@ [Kelly Gendron] Das funktioniert eigentlich nicht. Dies funktioniert nur für eigenständige Seiten ohne Code. Sehen Sie sich die Dokumentation in der Antwort und hier http://www.velocityreviews.com/forums/t602134-pagebasetype-attribute-in-pages-element.html für weitere Details an. – Rafi

0

Als Alternative zu Kellys Antwort, Sie können dies tun, die flexibler ist aber mehr Schmerz zu konfigurieren:

class MyChildPage : BasePage 

und ...

class BasePage : System.Web.UI.Page 

So MyChildPage erbt von BasePage, die von System.Web.UI.Page erbt.

+0

Das mache ich schon. Meine Frage ist, wie ich sicherstellen kann, dass ich in Zukunft, wenn ich neue Seiten erstellen werde, auch dann bleiben werde, wenn ich vergesse oder neue Entwickler dem Team beitreten. – Rafi

Verwandte Themen