2009-06-29 22 views
7

trang web asp.net của tôi cho phép người dùng chọn các chủ đề mà họ muốn từ một danh sách được tạo ra từ thư mục App_Themes. Đôi khi, các chủ đề được đổi tên hoặc xóa. Bất kỳ người dùng đã chọn một tên chủ đề bị xóa (nó được lưu trữ trong một cookie) sẽ nhận được ngoại lệ:Theme 'XXX' không thể được tìm thấy trong thư mục ứng dụng hoặc chủ đề toàn cầu

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 

đâu là nơi tốt nhất để bẫy và xử lý các ngoại lệ này?

Trả lời

2

Trong phương pháp Page_PreInit nơi bạn gán chủ đề, có một vài cách để đối phó với nó. Những gì tôi làm là kiểm tra để đảm bảo rằng thư mục tồn tại. Nếu có, thì đó là chủ đề tôi muốn. Nếu không, sau đó sử dụng một chủ đề mặc định, nơi tôi biết thư mục tồn tại.

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

Tôi thường lưu trữ trong ViewState vì vậy tôi không cần phải kiểm tra lại tất cả các thời gian, nhưng nếu bạn đang thay đổi chủ đề on-the-fly, sau đó có thể bạn sẽ cần phải không làm điều đó.

+0

Tôi có thể thấy rằng điều này sẽ làm việc nhưng nó có vẻ khá một chi phí cho mỗi yêu cầu trang. Có lẽ Directory.Exists mất một thời gian tương đối dài. Nó phải là rất hiếm hoi mà điều này xảy ra, và thats lý do tại sao tôi muốn nắm bắt những ngoại lệ, tôi chỉ wan't chắc chắn những gì loại ngoại lệ là hoặc nơi để đặt các catch. – simon831

+0

Tôi đồng ý - đó là lý do tại sao tôi lưu ý rằng chúng tôi lưu trữ kết quả trong khung nhìn, điều chỉnh chức năng ở trên. –

0

Bạn phải chắc chắn rằng bạn thay đổi tuỳ chọn chủ đề của người sử dụng nếu họ sử dụng chủ đề của bạn được đổi tên/xóa. Nếu đổi tên, sau đó đổi tên cho phù hợp, nếu bị xóa, thay đổi thành chủ đề mặc định. Bạn lưu trữ tùy chọn chủ đề trong cookie, bạn sẽ phải kiểm tra chúng và thực hiện thay đổi quyền truy cập của người dùng.

+0

Bạn có nói rằng không thể bắt ngoại lệ này? – simon831

+1

không, dĩ nhiên là không. Bạn luôn có thể xử lý nó trễ như trong Application_OnError trong Global.asax. –

3

nếu bạn sử dụng cookie để lưu trữ người dùng được lựa chọn chủ đề và bạn nhận được lỗi 'xxx'theme không tìm thấy trong thư mục địa phương hoặc toàn cầu, sau đó hãy chắc chắn rằng tên cookie của bạn là không giống với một tên cookie.

Các vấn đề liên quan