2011-07-07 156 views
4

最近,我讀了post,作者描述瞭如何將剃刀視圖編譯到單獨的庫中。我想問問,是否有可能在沒有編譯的情況下在圖書館中嵌入視圖?然後,添加自定義VirtualPathProvider以讀取視圖。嵌入式剃刀視圖

回答

1

在你的「殼」 MVC項目的Global.asax中的Application_Start註冊自定義的VirtualPathProvider:

HostingEnvironment.RegisterVirtualPathProvider(new CustomVirtualPathProvider()); 

實際的實現會比這更復雜,因爲你可能會做一些基於接口的,反射,數據庫查詢等作爲拉動元數據的一種手段,但是這將是總體思路(假設你有一個名爲「AnotherMvcAssembly」與富控制器和Index.cshtml查看其他MVC項目被標記爲嵌入的資源:

public class CustomVirtualPathProvider : VirtualPathProvider { 
    public override bool DirectoryExists(string virtualDir) { 
     return base.DirectoryExists(virtualDir); 
    } 

    public override bool FileExists(string virtualPath) { 
     if (virtualPath == "/Views/Foo/Index.cshtml") { 
      return true; 
     } 
     else { 
      return base.FileExists(virtualPath); 
     } 
    } 

    public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart) { 
     if (virtualPath == "/Views/Foo/Index.cshtml") { 
      Assembly asm = Assembly.Load("AnotherMvcAssembly"); 
      return new CacheDependency(asm.Location); 
     } 
     else { 
      return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
     } 
    } 

    public override string GetCacheKey(string virtualPath) { 
     return base.GetCacheKey(virtualPath); 
    } 

    public override VirtualDirectory GetDirectory(string virtualDir) { 
     return base.GetDirectory(virtualDir); 
    } 

    public override VirtualFile GetFile(string virtualPath) { 
     if (virtualPath == "/Views/Foo/Index.cshtml") { 
      return new CustomVirtualFile(virtualPath); 
     } 
     else { 
      return base.GetFile(virtualPath); 
     } 
    } 
} 

public class CustomVirtualFile : VirtualFile { 
    public CustomVirtualFile(string virtualPath) : base(virtualPath) { } 

    public override System.IO.Stream Open() { 
     Assembly asm = Assembly.Load("AnotherMvcAssembly"); 
     return asm.GetManifestResourceStream("AnotherMvcAssembly.Views.Foo.Index.cshtml"); 
    } 
} 
2

您可以使用我的EmbeddedResourceVirtualPathProvider,它可以通過Nuget安裝。它從引用的程序集加載資源,並且可以設置爲在開發過程中依賴源文件,因此您可以在不需要重新編譯的情況下更新視圖。

+0

你的圖書館爲我工作。感謝您通過製作nuget包的努力。 –