2010-11-18 3 views

답변

30

당신은 주제에 내 앞의 질문에서 코드를 복용 Pulling a View from a database rather than a file 또는 Using VirtualPathProvider to load ASP.NET MVC views from DLLs

확인 할 수 있습니다.

다른 페이지의 FileExists() 메서드에서 가상 경로에 데이터베이스 항목이 있는지 실제로 확인하는 일부 db 코드와 함께 테스트 코드를 대체합니다.

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하지 않는 DbVirtualFile을

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

것 그리고 지금 우리는 수정 : 데이터베이스가 같을 것 실제 파일 시스템에 대응해야한다. 이 두 클래스를 구현하여 기능을 재정의 할 수 있습니다.

그런 다음 이렇게

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 ("

안녕

"))을 반환합니다. 이 작업을 수행 할 때 "Directory '[..] \ View \ Home'이 존재하지 않습니다. 파일 변경 모니터링을 시작하지 못했습니다." 이견있는 사람? 당신의 도움을 주셔서 감사합니다! – pbz

관련 문제