2012-02-07 30 views
6

Có thể tạo chủ đề mặc định cho một trang web ASP.NET không?Mặc định ASP.NET Themes

Ví dụ, Nếu tôi có một chủ đề được gọi là "Default" và ive chọn một chủ đề được gọi là "NewTheme" và tôi tham chiếu một tập tin mà không tồn tại trong "NewTheme" nhưng không tồn tại trong chủ đề "Default" như:

<asp:image id="img" runat="server" ImageUrl="~/Images/image.jpg" /> 

Sau đó, nó có thể được lấy từ "/App_Themes/Default/Images/image.jpg" nếu nó không tồn tại ở "/App_Themes/NewTheme/Images/image.jpg" không?

Hơn nữa nếu một lớp CSS không tồn tại trong "NewTheme", nhưng nó đã làm trong "Default", sau đó nó có thể mất "Default"? Trong thực tế, tôi nghĩ rằng nó sẽ là tốt hơn nếu nó đầu tiên đã lấy tất cả các phong cách mặc định, và sau đó ghi đè bất kỳ "NewTheme" có xung đột.

Tôi biết Global References hoạt động tương tự như vậy bởi vì nếu ive chọn "es" bản địa hóa và khóa không tồn tại trong tệp webreference.resx.es nhưng nó sẽ có giá trị từ webreference.resx.

Tôi nghĩ rằng đây sẽ là chức năng quan trọng cho Chủ đề ASP.NET vì tôi có thể tưởng tượng các chủ đề khác nhau chỉ có một số hình ảnh thay đổi và một số kiểu đã thay đổi. Tôi không thể tưởng tượng mọi hình ảnh và mọi phong cách luôn hoàn toàn khác nhau cho mỗi Chủ đề. Và do đó mà không có chức năng này, nó sẽ là một trường hợp sao chép phong cách/hình ảnh, mà tôi không phải là một fan hâm mộ của (vì lý do rõ ràng!).

+3

Tiền thưởng về điều này! Tôi thích chức năng app_themes nhưng không thể kế thừa một chủ đề cơ sở là một nỗi đau lớn. – Malk

Trả lời

1

Chức năng này không được tích hợp vào ASP.NET. Tuy nhiên, bạn có thể triển khai khá dễ dàng:

  1. Móc sự kiện HttpApplication.BeginRequest trong Global.asax hoặc trong mô-đun HTTP tùy chỉnh.
  2. Tìm các yêu cầu có URL trong "/ App_Themes/NewTheme /".
  3. Kiểm tra xem tệp có tại HttpRequest.PhysicalPath không.
  4. Nếu tệp không tồn tại, hãy gọi HttpContext.RewritePath và thay thế "NewTheme" trong URL yêu cầu bằng "Mặc định".
+0

Vui lòng xem chỉnh sửa của tôi. Bạn có nghĩ rằng một sửa chữa như thế này sẽ làm việc cho CSS? – Curt

+0

Đối với CSS, tôi khuyên bạn nên đặt '@import url (" ../ Default/stylesheet.css ")' ở đầu "/App_Themes/NewTheme/stylesheet.css" để tất cả các quy tắc xếp tầng CSS bình thường hoạt động như bình thường. –

+0

@Curt: Câu trả lời này có hiệu quả không, có phải là không rõ ràng hay bạn đang tìm kiếm mã chi tiết? –

2

Chủ đề mặc định khi bạn mô tả không được ASP.NET hỗ trợ. Có thường xuyên ThemesStyleSheetTheme s, nhưng việc thay đổi chúng theo cách động sẽ hữu ích hơn ở cấp yêu cầu Trang so với các Điều khiển riêng lẻ hoặc các tệp tĩnh.

Bạn có thể mã hóa phiên bản chủ đề của riêng mình cho các tệp tĩnh bằng cách viết lại URL hoặc định tuyến - nhưng sau đó nó không thực sự là Chủ đề nữa.

Đối với các điều khiển như <asp:Image>, bạn có thể ghi đè và sửa đổi các thuộc tính như ImageUrl dựa trên tệp nào tồn tại trong một số phân cấp của thư mục "chủ đề". Sau đó, sử dụng ánh xạ thẻ để thay thế tất cả các phiên bản của điều khiển đó bằng một điều khiển mới, mà không yêu cầu bất kỳ thay đổi đánh dấu nào.

FWIW, sự kiện BeginRequest trong Global.asax chỉ được gọi cho các tệp động trong IIS (Cassini cũng gọi nó là cho statics). Để hỗ trợ các số liệu thống kê trong IIS, bạn cần có HttpModule và bạn cũng sẽ cần phải cấu hình IIS để chạy trong chế độ Tích hợp.

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