2011-02-18 24 views
5

Tôi hiện có ứng dụng .net mvc3 chịu trách nhiệm quản lý các chế độ xem tương tự ở nhiều vị trí cũng sử dụng cùng một bộ điều khiển, ví dụ: site1/v1/views/index.cshtmlsite1/v2/views/index.cshtml. Cách thức này được xử lý là bằng cách tạo ra một CustomControllerFactory kế thừa từ DefaultControllerFactory và trong phương thức CreateController, xóa các công cụ xem hiện có và thêm một khung nhìn tùy chỉnh mớiEngine chỉ định định dạng vị trí xem dựa trên url hiện tại.MVC Razor ViewEngine không an toàn cho chủ đề?

Nếu người dùng truy cập site1.com/v1/index.cshtml, các viewengine sẽ xác định vị trí quan điểm của:

string versionDirectory = "v1"; 
ViewLocationFormats = new[]{ versionDirectory + "/Views/{0}.cshtml", 
          "/Views/{0}.cshtml", 
          "~/Shared/{0}.cshtml" 
          }; 

Vấn đề mà tôi đang gặp là nếu nhiều người dùng truy cập các trang khác nhau ở khoảng thời tất cả người dùng sẽ thấy cùng một chế độ xem.

Initially i thought this was related to caching, nhưng sau khi đặt rõ ràng usecache = false trong chế độ xem tùy chỉnhEngine, có vẻ như việc này có liên quan nhiều hơn với ViewEngines class not being thread safe.

Có ai có bất kỳ ý tưởng nào về cách tôi có thể thực hiện một kết quả tương tự không, nhưng theo một cách khác?

cảm ơn trước.

+0

không chắc chắn cách bạn thực hiện việc này nhưng mọi đối tượng tĩnh được chia sẻ trên tất cả các yêu cầu - có thể liên quan đến sự cố của bạn ... – Buildstarted

Trả lời

9

Bộ sưu tập ViewEngines là một bộ sưu tập tĩnh và do đó giá trị của nó được chia sẻ theo yêu cầu. Những gì bạn đang cố gắng làm là có thể, nhưng cách bạn đang làm nó là không chính xác.

Một cách tiếp cận dễ dàng là viết một công cụ xem tùy chỉnh xuất phát từ RazorViewEngine và ghi đè phương thức FindView. Phương thức đó được gọi một lần cho mỗi yêu cầu. Trong triển khai của bạn, hãy gọi base.FindView và sau đó sửa đổi kết quả (nếu nó không phải là null) để bao gồm thông tin trang web bạn cần.

Scott Hanselman có bài đăng blog hiển thị một ví dụ về việc tìm kiếm vị trí khác cho lượt xem qua công cụ chế độ xem tùy chỉnh. http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

+0

Cảm ơn bạn! Điều này làm việc – kfegen

+0

FYI nguồn trong bài đăng đó có lỗi sản xuất chính trong đó, có phiên bản cập nhật của công cụ xem của anh ấy tại: https://bitbucket.org/shanselman/mobileviewengines/src/48310997a453/Helpers/MobileCapableRazorViewEngine.cs bất kể bài viết gốc và liên kết mới mà tôi đã cung cấp là chìa khóa để tôi giải quyết lựa chọn nghèo nàn của mình để sửa đổi bộ sưu tập base.ViewLocationFormats không hiểu nó là tĩnh như trái ngược với yêu cầu http mà tôi nghĩ nhầm. –

1

Công cụ xem tích hợp sẵn an toàn cho chủ đề. Vấn đề của bạn là bộ nhớ đệm hoặc công cụ xem tùy chỉnh của bạn. Kiểm tra các bình luận bộ nhớ đệm trong liên kết trong câu trả lời khác.

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