在应用程序或全局主题目录中找不到主题“XXX”

时间:2009-06-29 10:04:32

标签: asp.net themes

我的asp.net网站允许用户从app_themes文件夹生成的列表中选择他们想要的主题。有时会重命名或删除主题。选择已删除主题名称的任何用户(它存储在cookie中)都将获得例外:

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

陷阱和处理此异常的最佳位置在哪里?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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();
    }
}

我通常存储在视图状态中,因此我不必每次都重新检查,但如果您正在即时更改主题,那么您可能不需要这样做。

答案 2 :(得分:0)

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