2010-11-18 41 views

回答

30

你可能要檢查Pulling a View from a database rather than a fileUsing VirtualPathProvider to load ASP.NET MVC views from DLLs

我以前關於這個問題的問題以代碼。

在另一個頁面上的FileExists()方法中,我用那些實際檢查虛擬路徑是否在數據庫中有條目的數據庫代碼替換了那裏的測試代碼。你的數據庫看起來是這樣的:

Views --tablename 
    Path --view's virtual path 
    SomeOtherValue 

...然後您的通話將類似於

public class DbPathProvider : VirtualPathProvider { 
    public DbPathProvider() : base() { 

    } 

    public override bool FileExists(string virtualPath) { 
     Database db = new Database(); 
     return db.Views.Any(w => w.Path == virtualPath); 
    } 

    public override VirtualFile GetFile(string virtualPath) { 
     return new DbVirtualFile(virtualPath); 
    } 
} 

現在我們修改DbVirtualFile

public class DbVirtualFile : System.Web.Hosting.VirtualFile { 

    public DbVirtualFile(string path) : base (path) { 

    } 

    public override System.IO.Stream Open() { 
     Database db = new Database(); 
     return new System.IO.MemoryStream(
        db.Views.Single(v => v.Path == this.VirtualPath)); 
    } 
} 

的virtualPath不如果你不想要,它必須對應一個真正的文件系統。您可以通過實現這兩個類來覆蓋功能。

然後,您可以註冊新的VirtualPathProvider在Global.asax像這樣

HostingEnvironment.RegisterVirtualPathProvider(new DbPathProvider()); 

我希望這更好的回答你的問題。

+0

也許我錯過了一些東西,但是在解決方案指向(http://www.umbraworks.net/bl0g/rebuildall/2009/11/17/ASP_NET_MVC_and_virtual_views)的教程中,條件是將一個實際的文件打開磁盤(/View/Pages/Test.aspx)並提供「填充」。我正在尋找一個解決方案,允許我指定整個頁面。 – pbz 2010-11-19 00:56:13

+0

根據關於虛擬路徑的混淆更新了問題 – Buildstarted 2010-11-19 15:16:51

+0

我正在使用不使用數據庫的示例。在FileExists中,我檢查「/View/Home/Test.cshtml」(我的虛擬文件),並在Open方法中返回新的MemoryStream(Encoding.ASCII.GetBytes(「

Hi

」));當我這樣做時,我得到「目錄」[..] \ View \ Home'不存在。無法啓動監視文件更改。「有什麼想法嗎?謝謝你的幫助! – pbz 2010-11-20 02:23:54

相關問題