2010-11-18 26 views

答えて

30

あなたは、件名に私の以前の質問からコードを取るPulling a View from a database rather than a fileUsing VirtualPathProvider to load ASP.NET MVC views from DLLs

チェックすることをお勧めします。

他のページのFileExists()メソッドでは、私がそこに持っているテストコードを、virtualPathにデータベースにエントリがあるかどうかを実際に確認するいくつかのdbコードと置き換えます。 virtualPathにはない

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)); 
    } 
} 

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

を変更 :あなたのデータベースは次のようになります本当のファイルシステムに対応していなければならない。これらの2つのクラスを実装することによって、機能をオーバーライドできます。

あなたはそのように

HostingEnvironment.RegisterVirtualPathProvider(new DbPathProvider()); 

私は、これは、より良いあなたの質問に答える願うようにGlobal.asaxの中で、あなたの新しいVirtualPathProviderを登録することができます。

+0

多分私は何かが不足しているかもしれませんが、チュートリアルで解決策(http://www.umbraworks.net/bl0g/rebuildall/2009/11/17/ASP_NET_MVC_and_virtual_views)を指しているのは、実際のファイルを置くことですディスク(/View/Pages/Test.aspx)を入力し、 "塗りつぶし"を入力します。私はページ全体を指定できる解決策を探しています。 – pbz

+0

仮想パスに関する混乱に基づいて質問が更新されました – Buildstarted

+0

私はデータベースを使用しないサンプルを使っています。 FileExistsでは "/View/Home/Test.cshtml"(私の仮想ファイル)をチェックし、Openメソッドでは新しいMemoryStream(Encoding.ASCII.GetBytes( "

こんにちは

")を返します。私がこれを行うと、 "ディレクトリ '[..] \ View \ Home'が存在しません。ファイルの変更の監視を開始できませんでした。何かご意見は?ご協力いただきありがとうございます! – pbz

関連する問題