2009-06-29 16 views
7

Il mio sito asp.net consente agli utenti di selezionare il tema desiderato da un elenco generato dalla cartella app_themes. Di volta in volta, i temi vengono rinominati o rimossi. Qualsiasi utente che ha selezionato un nome tema eliminata (è memorizzato in un cookie) otterrà l'eccezione:Impossibile trovare il tema "XXX" nell'applicazione o nelle directory di temi globali

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 

Dove è il posto migliore per intercettare e gestire questa eccezione?

risposta

2

Nel metodo Page_PreInit in cui si assegnano i temi, ci sono un paio di modi per affrontarli. Quello che faccio è controllare che la directory esista. Se lo fa, allora questo è il tema che voglio. In caso contrario, utilizza un tema predefinito in cui so che la directory esiste.

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

solito negozio nel ViewState, quindi non c'è bisogno di ricontrollare ogni volta, ma se stai cambiando i temi on-the-fly, allora avrete probabilmente bisogno di non farlo.

+0

Posso vedere che questo funzionerebbe ma sembra piuttosto un sovraccarico per ogni richiesta di pagina. Presumibilmente Directory.Exists richiede un tempo relativamente lungo. Dovrebbe essere molto raro che ciò accada, e questo è il motivo per cui ho voluto catturare l'Eccezione, ma non sono sicuro di quale fosse il tipo di eccezione o dove inserire il blocco di prova. – simon831

+0

Sono d'accordo: ecco perché ho notato che memorizziamo il risultato nel viewstate, che modifica la funzione sopra. –

0

È necessario assicurarsi di modificare la preferenza del tema degli utenti se utilizzano il tema da rinominare/eliminare. Se rinominato, quindi rinominare di conseguenza, se eliminato, passare al tema predefinito. Poiché si memorizza la preferenza del tema all'interno dei cookie, è necessario controllarli e apportare la modifica per l'accesso dell'utente.

+0

Stai dicendo che è impossibile rilevare questa eccezione? – simon831

+1

no, certo che no. È sempre possibile gestirlo fino a tardi in Application_OnError in Global.asax. –

3

se si utilizzano i cookie per memorizzare il tema selezionato dall'utente e si ottiene l'errore 'xxx'theme non trovato nella directory locale o globale, quindi assicurarsi che il nome del cookie non sia uguale a un altro nome di cookie.

Problemi correlati