2009-06-29 47 views
7

我的asp.net网站允许用户从app_themes文件夹生成的列表中选择他们想要的主题。不时,主题被重新命名或删除。谁选择了删除的主题名称(它被存储在cookie中)的任何用户将得到异常:主题'XXX'无法在应用程序或全局主题目录中找到

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 

哪里是陷阱的最好的地方和处理这个异常?

回答

2

在分配主题的Page_PreInit方法中,有几种方法可以处理它。我所做的是检查以确保该目录存在。如果是这样,那么这就是我想要的主题。如果没有,那么在我知道该目录存在的地方使用默认主题。

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

我通常在ViewState中存储,所以我不必重新检查每一次,但如果你改变对即时的主题,那么你就可能需要那么做。

0

您必须确保您更改用户的主题首选项,如果他们使用您的主题进行重命名/删除。如果重命名,则相应地重命名,如果删除,则更改为默认主题。当您在Cookie中存储主题首选项时,您必须检查它们并对用户访问进行更改。

+0

你是说它不可能发现这个异常? – simon831 2009-06-29 10:32:51

+1

当然没有。您可以随时处理Global.asax中的Application_OnError。 – 2009-06-29 12:30:28

3

如果您使用cookie来存储用户选择的主题,并且在本地或全局目录中找不到错误'xxx'theme,请确保您的cookie名称与另一个cookie名称不同。