2008-10-25 11 views
41

Dựa trên câu hỏi này here và sử dụng mã được tìm thấy here Tôi đang cố gắng tải chế độ xem được nhúng tài nguyên trong một dự án DLL riêng biệt và tác giả của câu hỏi ban đầu cho biết thành công làm điều này - nhưng tôi không thể làm cho nó hoạt động vì có vẻ như công cụ xem MVC đang chặn yêu cầu và vẫn đang xem xét hệ thống tệp cho chế độ xem. Ngoại lệ:Sử dụng VirtualPathProvider để tải chế độ xem ASP.NET MVC từ các tệp DLL

Server Error in '/' Application. 
The view 'Index' or its master could not be found. The following locations were searched: 
~/Views/admin/Index.aspx 
~/Views/admin/Index.ascx 
~/Views/Shared/Index.aspx 
~/Views/Shared/Index.ascx 
~/App/Views/admin/Index.aspx 
~/App/Views/admin/Index.ascx 
~/App/Views/Shared/Index.aspx 
~/App/Views/Shared/Index.ascx 

Tôi đang sử dụng một CustomViewEngine, giống như một cấu trúc/App Rob Connery như sau:

public class CustomViewEngine : WebFormViewEngine 
    { 
     public CustomViewEngine() 
     { 
      MasterLocationFormats = new[] { 
       "~/App/Views/{1}/{0}.master", 
       "~/App/Views/Shared/{0}.master" 
       }; 

      ViewLocationFormats = new[] { 
       "~/App/Views/{1}/{0}.aspx", 
       "~/App/Views/{1}/{0}.ascx", 
       "~/App/Views/Shared/{0}.aspx", 
       "~/App/Views/Shared/{0}.ascx" 
       }; 

      PartialViewLocationFormats = ViewLocationFormats; 
     } 
    } 

Dưới đây là tuyến đường của tôi:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute("Home", "", new {controller = "Page", action = "Index", id = "Default"}); 
    routes.MapRoute("Default", "Page/{id}", new { controller = "Page", action = "Index", id = "" }); 
    routes.MapRoute("Plugins", "plugin/{controller}/{action}", new { controller = "", action = "Index", id = "" }); 
    routes.MapRoute("Error", "{*url}", new { controller = "Error", action = "ResourceNotFound404" }); 

Trong tôi AssemblyResourceProvider Tôi kiểm tra xem đường dẫn có bắt đầu ~/plugin/ và sau đó sử dụng quy ước tên tệp dll plugin.{controller}.dll

Mọi đề xuất?

CẬP NHẬT: Vào thời điểm yêu cầu được định tuyến nói http://localhost/plugin/admin sẽ chuyển đến VirtualFileProvider, nó không có bất kỳ Chế độ xem nào được đính kèm ở cuối. Vì vậy, trong phương thức Open của VirtualFileProvider, đường dẫn ảo của ~/plugin/admin đang được chuyển vào khi nó phải là ~/plugin/admin/Index.aspx như được định nghĩa trong tuyến đường của tôi ở trên. Tôi đã làm rối tung các tuyến đường của mình hay tôi có quyền mong đợi điều này xảy ra không?

+3

Đó FileExists đầu tiên gọi xảy ra trước bộ điều khiển chạy, và phải trả về false hoặc IIS sẽ cố gắng phục vụ nó như một tệp tĩnh. Yêu cầu cho tệp aspx thực tế đến sau, khi trình điều khiển yêu cầu một khung nhìn. –

Trả lời

25
  1. Bạn phải đăng ký VirtualPathProvider trong trình xử lý Global.asaxApplication_Start.
  2. Bạn phải gọi xem trong DLL của bạn bằng cách sử dụng con đường đặc biệt như vậy: return View("~/Plugin/YOURDLL.dll/FULLNAME_YOUR_VIEW.aspx");

Dưới đây là một bài viết với mẫu mã tải về mà chứng tỏ điều này:

http://www.wynia.org/wordpress/2008/12/aspnet-mvc-plugins/

+0

thư mục Plugin là gì? Hay nó chỉ là một không gian tên? – Mou

+0

liên kết cho wynia.org đã chết .. – Alok

5

WebFormsViewEngine tích hợp sử dụng VirtualPathProviders, vì vậy nếu bạn viết VPP và đăng ký nó, bạn sẽ không cần thực hiện bất kỳ thay đổi nào đối với công cụ xem.

+0

Đó là những gì tôi đang làm, nhưng nó có vẻ không hoạt động: ( – jmcd