2010-08-17 89 views
2

我正在爲Asp.net MVC 2的插件系統工作。我有一個包含控制器和視圖作爲嵌入式資源的DLL。Asp.net MVC VirtualPathProvider視圖解析錯誤

我使用StructureMap掃描控制器的插件DLL,然後我可以將它們拉出並在請求時將它們實例化。這工作正常。然後,我有一個的VirtualPathProvider我改編自this post

public class AssemblyResourceProvider : VirtualPathProvider 
{ 
    protected virtual string WidgetDirectory 
    { 
     get 
     { 
      return "~/bin"; 
     } 
    } 

    private bool IsAppResourcePath(string virtualPath) 
    { 
     var checkPath = VirtualPathUtility.ToAppRelative(virtualPath); 
     return checkPath.StartsWith(WidgetDirectory, StringComparison.InvariantCultureIgnoreCase); 
    } 

    public override bool FileExists(string virtualPath) 
    { 
     return (IsAppResourcePath(virtualPath) || base.FileExists(virtualPath)); 
    } 

    public override VirtualFile GetFile(string virtualPath) 
    { 
     return IsAppResourcePath(virtualPath) ? new AssemblyResourceVirtualFile(virtualPath) : base.GetFile(virtualPath); 
    } 

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, 
                 DateTime utcStart) 
    { 
     return IsAppResourcePath(virtualPath) ? null : base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
    } 
} 

internal class AssemblyResourceVirtualFile : VirtualFile 
{ 
    private readonly string path; 

    public AssemblyResourceVirtualFile(string virtualPath) 
     : base(virtualPath) 
    { 
     path = VirtualPathUtility.ToAppRelative(virtualPath); 
    } 

    public override Stream Open() 
    { 
     var parts = path.Split('/'); 
     var resourceName = Path.GetFileName(path); 

     var apath = HttpContext.Current.Server.MapPath(Path.GetDirectoryName(path)); 
     var assembly = Assembly.LoadFile(apath); 
     return assembly != null ? assembly.GetManifestResourceStream(assembly.GetManifestResourceNames().SingleOrDefault(s => string.Compare(s, resourceName, true) == 0)) : null; 
    } 
} 

的VPP似乎也工作正常。該視圖被發現並被拖入流中。然後我收到一個解析錯誤Could not load type 'System.Web.Mvc.ViewUserControl<dynamic>'.,在前面任何可插入視圖的例子中我都找不到這個解析錯誤。爲什麼我的觀點在現階段不會編譯?

感謝您的幫助,

伊恩

編輯:

越來越近一個答案,但不是很清楚爲什麼事情沒有編制。基於評論我檢查了版本,一切都在V2中,我相信動態是在V2引入的,所以這很好。我甚至沒有安裝V3,所以它不能這樣。然而,如果我完全刪除了<dynamic>,我還是有意提交。

因此,一個VPP的作品,但只有當視圖不強類型或動態

這是有道理的,強類型場景的類型是動態加載的DLL,以便在視圖引擎不會意識到這一點,即使該DLL在垃圾箱中。有沒有辦法在應用程序啓動時加載類型?考慮與MEF合作,而不是我定製的Structuremap解決方案。你怎麼看?

+0

您確定您使用的是MVC2嗎?這種類型的「System.Web.Mvc.ViewUserControl 」看起來像帶有動態模型的新MVC 3視圖。同時檢查包含嵌入資源的dll是否依賴於MVC 2或3。 – 2010-08-18 13:48:22

+0

這聽起來很像一箇舊的ReSharper錯誤,它會創建損壞的默認視圖。你在用嗎? – bzlm 2010-08-18 16:20:20

+0

@Branislav Abadjimarinov - 見上面的編輯。 @bzlm - 我確實有Resharper,我從來沒有聽說過這個bug,但會感謝。 – madcapnmckay 2010-08-18 20:10:03

回答

2

允許解析強類型視圖的設置位於〜/ Views/Web.Config中。當視圖引擎使用虛擬路徑提供程序時,它不在視圖文件夾中,因此不會加載這些設置。

如果您將Views/Web.Config的頁面節點中的所有內容複製到根Web.Config,則強類型視圖將被正確解析。