2009-06-29 4 views
7

Meine asp.net-Site ermöglicht Benutzern, das gewünschte Thema aus einer Liste aus dem app_themes-Ordner auszuwählen. Von Zeit zu Zeit werden Themen umbenannt oder entfernt. Jeder Benutzer, der ein gelöschtes Thema Namen ausgewählt hat (in einem Cookie gespeichert wird) wird die Ausnahme erhalten:Theme 'XXX' kann nicht in der Anwendung oder globalen Themenverzeichnisse gefunden werden

Theme 'XXX' cannot be found in the application or global theme directories 
Stack Trace: 
[HttpException (0x80004005): Theme 'test' cannot be found in the application or global theme directories.] 
    System.Web.Compilation.ThemeDirectoryCompiler.GetThemeBuildResultType(String themeName) +920 
    System.Web.Compilation.ThemeDirectoryCompiler.GetThemeBuildResultType(HttpContext context, String themeName) +73 
    System.Web.UI.Page.InitializeThemes() +8699455 
    System.Web.UI.Page.PerformPreInit() +38 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +282 

Wo ist der beste Ort zu stoppen und zu handhaben diese Ausnahme?

Antwort

2

In der Page_PreInit-Methode, der Sie Themen zuweisen, gibt es mehrere Möglichkeiten, damit umzugehen. Ich überprüfe, ob das Verzeichnis existiert. Wenn ja, dann ist das das Thema, das ich möchte. Wenn dies nicht der Fall ist, verwenden Sie ein Standardthema, von dem ich weiß, dass das Verzeichnis existiert.

void Page_PreInit(object sender, EventArgs e) 
{ 
    if (ViewState["PageTheme"] == null) 
    { 
     if (!Directory.Exists("~/App_Themes/THEMENAME_TO_LOOK_FOR")) 
     { 
      Theme = "DEFAULT_THEME" 
     } 
     else 
     { 
      Theme = "THEMENAME_TO_LOOK_FOR"; 
     } 
     ViewState["PageTheme"] = Theme; 
    } 
    else 
    { 
     Theme = ViewState["PageTheme"].ToString(); 
    } 
} 

speichere ich in der Regel in der Ansichtszustand so muss ich nicht jedes Mal erneut prüfen, aber wenn Sie Themen on-the-fly zu ändern, dann werden Sie wahrscheinlich müssen das nicht tun.

+0

Ich kann sehen, dass dies funktionieren würde, aber es scheint ziemlich viel Aufwand für jede Seitenanforderung. Vermutlich dauert Directory.Exists relativ lange. Es sollte sehr selten sein, dass dies passiert, und deshalb wollte ich die Ausnahme fangen, ich wollte nur sicher sein, was der Ausnahme-Typ war oder wo der Versuch zu fangen. – simon831

+0

Ich stimme zu - deshalb habe ich festgestellt, dass wir das Ergebnis im Viewstate speichern, der die obige Funktion modifiziert. –

0

Sie müssen sicherstellen, dass Sie die Designeinstellungen des Benutzers ändern, wenn sie Ihr Design zum Umbenennen/Löschen verwenden. Wenn Sie umbenannt werden, benennen Sie sie entsprechend um. Wenn Sie sie löschen, wechseln Sie zum Standarddesign. Wenn Sie die Designeinstellungen in den Cookies speichern, müssen Sie sie überprüfen und die Änderungen beim Benutzerzugriff vornehmen.

+0

Sie sagen, es ist unmöglich, diese Ausnahme zu fangen? – simon831

+1

nein natürlich nicht. Sie könnten es immer so spät wie in Application_OnError in Global.asax behandeln. –

3

Wenn Sie Cookies verwenden, um ein vom Benutzer ausgewähltes Thema zu speichern, und Sie den Fehler 'xxx'theme nicht im lokalen oder globalen Verzeichnis finden, stellen Sie sicher, dass Ihr Cookie-Name nicht mit einem anderen Cookie-Namen übereinstimmt.

Verwandte Themen