2009-10-29 42 views
0

我有以下一組我用來在View中動態加載的類。下面的代碼在使用.RenderPartial調用時效果很好。使用VirtualPathProvider動態加載視圖時的參考問題

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

    public override Stream Open() 
    { 

     string path = this.VirtualPath; 
     Stream str = new MemoryStream(); 
     StreamWriter writer = new StreamWriter(str); 
     writer.Write(@"<%@ Control Language=""C#"" Inherits=""System.Web.Mvc.ViewUserControl"" %> 
      <%="Test"%> 

      "); 
     writer.Flush(); 
     str.Position = 0; 
     return str; 
    } 
} 
public class Provider:VirtualPathProvider 
{ 
    public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     return null; 
     var dependency = new System.Web.Caching.CacheDependency(virtualPath); 
     return dependency;// base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
    } 
    public override bool DirectoryExists(string virtualDir) 
    { 
     if (IsVirtual(virtualDir)) 
     { 
      return true; 
     } 
     return base.DirectoryExists(virtualDir); 
    } 
    public override bool FileExists(string virtualPath) 
    { 
     if (IsVirtual(virtualPath)) 
     { 
      return true; 
     } 
     return base.FileExists(virtualPath); 
    } 
    public override VirtualFile GetFile(string virtualPath) 
    { 

     if(IsVirtual(virtualPath)) 
     { 
      return new VirtFile(virtualPath);     
     } 

     return base.GetFile(virtualPath); 
    } 

    private bool IsVirtual(string virtualPath) 
    { 
     return virtualPath.Contains("Database"); 
    } 

但是,如果我試圖改變<%="Test"%><%=new Model.Category()%>,創造一個類型的視圖我得到一個錯誤,指出「類型或命名空間名稱‘示範’找不到(是否缺少using指令或一個彙編參考?)「。但是,如果只將它放在.ascx文件中,則相同的代碼可以工作。

我是否錯過了一些東西,它好像來自文件系統或自定義VirtualPathProvider的流應該具有相同的加載程序集,因爲<%=AppDomain.CurrentDomain.ApplicationIdentity%>從文件系統或自定義提供程序返回相同的值。

回答

1

嘗試增加

<%@ Import Namespace="MyApp.Model" %> 

到您的動態用戶控制串。

編輯:

當然,你也可以使用完全合格的名稱類型,改變Model.Category()MyApp.Model.Category()。大多數情況下,我導入命名空間。只是一種風格偏好。

0

你的模型類是怎麼樣的?它是否包含在某個名稱空間中? VPP是非常神奇的事情,可以做很多魔術,只要確保當你爲虛擬聊天室的'網頁'內容傳遞'字符串'時,你提供了完整的課程路徑,這樣更安全。或者,另一個選項,使用你的web.config來鏈接你的名字空間,所以應用程序會找到你的類。

+0

我的模型基本上是公共類分類{ 公衆詮釋標識{獲得;設置;} 公共字符串名稱{獲取;集;} 公共字符串描述{獲取;集;} 公共範疇家長{獲得;設置; } } 我已經將Model.Category命名空間添加到Web應用程序web.config。 – 2009-10-29 12:40:35

+0

我不確定你的意思是我的課程的完整路徑。 – 2009-10-29 12:42:16

相關問題