2009-06-29 18 views
7

私のasp.netサイトでは、ユーザーがapp_themesフォルダから生成されたリストから必要なテーマを選ぶことができます。時々、テーマの名前が変更または削除されます。削除されたテーマ名を選択したすべてのユーザー(それがクッキーに保存されている)例外が発生します:テーマ「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(); 
    } 
} 

はので、私はすべての時間を再チェックする必要はありませんが、あなたはオンザフライテーマを変更している場合、あなたはおそらくそれをしない必要があります。

+0

これはうまくいくはずですが、すべてのページリクエストでかなりオーバーヘッドに見えます。おそらくDirectory.Existsは比較的長い時間がかかります。 これが起こることは非常にまれであるはずです。なぜ、例外をキャッチしたかったのか、例外タイプが何であったのか、try catchをどこに置くのかはわかりません。 – simon831

+0

私は同意しました - なぜ私は上記の関数を変更するviewstateに結果を格納することに注意しました。 –

0

あなたのテーマを使用して名前を変更/削除する場合は、必ずユーザーのテーマ設定を変更する必要があります。名前を変更した場合は、それに応じて名前を変更し、削除された場合はデフォルトのテーマに変更します。クッキー内にテーマ設定を保存すると、それらを確認してユーザーアクセスを変更する必要があります。

+0

この例外をキャッチすることは不可能ですか? – simon831

+1

もちろんです。 Global.asax内のApplication_OnErrorのように、いつもそれを処理できます。 –

3

ユーザーが選択したテーマを保存するためにCookieを使用し、ローカルまたはグローバルディレクトリに「xxx」というエラーが見つからない場合は、Cookie名が別のCookie名と同じでないことを確認してください。

関連する問題