2014-02-17 7 views
2

ASP.NET 레거시 프로젝트 전체에 여러 ASCX 파일이 있습니다. 다른 마크 업이 있지만 여전히 이전 코드 비하인드 유형을 참조하는 ascx 파일을 표시하고 싶습니다.VirtualPathProvider의 오류 메시지

Line 10: <%@ Register src="~/CMS/Header.ascx" tagname="Header" tagprefix="uc2" %> Line 11: <div id="Content" runat="server"> class="widget"> 


The VirtualPathProvider returned a VirtualFile object with VirtualPath set to '/MyLib/BootstrapHeader.ascx' instead of the expected '/CMS/Header.ascx'. 

은 무엇이 오류의 원인이 될 수 있습니다 :

는 지금은 성가신 오류 메시지는 무엇입니까? My Open 메서드도 호출되지 않습니다. 무엇을 제공합니다.

public class CMSContentVirtualPathProvider : VirtualPathProvider 
{ 

    private const string CMSContentPath = "CMS/"; 
    private const string CMSControlFolderName = "MyLib/"; 
    private const string CMSPageFolderName = "Pages/"; 
    private const string CMSMasterPagesFolderName = "Master/"; 

    private const string CMSPrefix = "Bootstrap"; 

    public static void AppInitialize() 
    { 
     HostingEnvironment.RegisterVirtualPathProvider(new CMSContentVirtualPathProvider()); 
    } 

    public override VirtualFile GetFile(string virtualPath) 
    { 
     // We've encountered my url 
     if (IsVirtualPath(virtualPath)) 
     { 
      return base.GetFile(virtualPath); 
     } 

     var translatedPath = TranslatePath(virtualPath); 

     if (base.FileExists(translatedPath)) 
      return new CMSContentVirualFile(translatedPath); 

     return Previous.GetFile(virtualPath); 
    } 

    private static string TranslatePath(string virtualPath) 
    { 
     // We've encountered a regular url 
     // translate the URL based on the file type and return it if it exists 
     var translatedPath = "~/" + CMSContentPath; 

     var fileName = CMSPrefix + VirtualPathUtility.GetFileName(virtualPath); 

     if (fileName.EndsWith("ascx", StringComparison.OrdinalIgnoreCase)) 
     { 
      translatedPath = VirtualPathUtility.Combine(translatedPath + CMSControlFolderName, fileName); 
     } 
     else if (fileName.EndsWith("aspx", StringComparison.OrdinalIgnoreCase)) 
     { 
      translatedPath = VirtualPathUtility.Combine(translatedPath + CMSPageFolderName, fileName); 
     } 
     else if (fileName.EndsWith("master", StringComparison.OrdinalIgnoreCase)) 
     { 
      translatedPath = VirtualPathUtility.Combine(translatedPath + CMSMasterPagesFolderName, fileName); 
     } 
     return translatedPath; 
    } 

    public override bool FileExists(string virtualPath) 
    { 
     if (IsVirtualPath(virtualPath)) 
      return true; 

     return Previous.FileExists(virtualPath); 
    } 

    public static bool IsVirtualPath(string virtualPath) 
    { 
     return virtualPath.Contains(CMSContentPath); 
    } 
} 

public class CMSContentVirualFile : VirtualFile 
{ 
    private string CMSPath = "Testing the test and seeing if it works...."; 
    public CMSContentVirualFile(string virtualPath) 
     : base(virtualPath) 
    { 
     CMSPath = VirtualPathUtility.ToAppRelative(virtualPath); 
    }// open is never called 

    public override Stream Open() 
    { 
     ASCIIEncoding encoding = new ASCIIEncoding(); 
     return new MemoryStream(encoding.GetBytes(this.CMSPath), false); 
    } 
} 

}

답변