2009-06-29 28 views
7

Asp.net sitem, kullanıcıların app_themes klasöründen oluşturulan bir listeden istedikleri temayı seçmelerine izin veriyor. Zaman zaman temalar yeniden adlandırılır veya kaldırılır. Silinen tema adı (eğer çerezler saklanır) Seçilen herhangi bir kullanıcı istisna alacak:Tema 'XXX' uygulamada veya global tema dizinlerinde bulunamıyor

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 

tuzak için en iyi yerdir ve bu durum ele?

cevap

2

Temaları atadığınız Page_PreInit yönteminde, bununla başa çıkmanın birkaç yolu vardır. Yaptığım şey, dizinin var olduğundan emin olmak için kontrol etmektir. Eğer yaparsa, o zaman istediğim tema budur. Yoksa, dizini bildiğim varsayılan bir tema kullanın. Genellikle Görünüm durumu depolamak

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

yüzden her zaman yeniden kontrol gerekmez ancak on-the-fly temaları değiştirirken, o zaman muhtemelen bunu gerekir. Kullanıcı seçilen temayı saklamak için çerez kullanırsanız ve 'xxx'theme yerel veya genel dizinde bulunamıyorsanız, o zaman çerez adınızın başka bir çerez adıyla aynı olmadığından emin olun.

+0

Bunun işe yarayacağını görebiliyorum ama her sayfa isteği için oldukça fazla bir yük olarak görünüyor. Tahminen Directory.Exists nispeten uzun bir zaman alır. Bunun olması çok nadir olmalı ve bu yüzden İstisna'yı yakalamak istemedim, istisna tipinin ne olduğundan emin olamadım ya da deneyin yakalanmasını nereye koyacağımı bilmiyorum. – simon831

+0

Katılıyorum - bu nedenle, yukarıdaki işlevi değiştiren sonucu görünümde sakladığımızı belirtmiştim. –

0

Yeniden adlandırılacak/silinecek olan temanızın kullanılması durumunda kullanıcıların tema tercihlerini değiştirdiğinizden emin olmanız gerekir. Yeniden adlandırıldıysa, daha sonra yeniden adlandırın, silinirse, varsayılan temaya geçin. Tema tercihini çerezlerin içinde sakladığınızda bunları kontrol etmeniz ve kullanıcı erişiminde değişiklik yapmanız gerekir.

+0

Bu istisnayı yakalamanın imkansız olduğunu mu söylüyorsunuz? – simon831

+1

tabi ki hayır. Her zaman Global.asax içinde Application_OnError'da olduğu gibi işlem yapabilirsiniz. –

3