2009-10-29 2 views
0

뷰에서 동적으로로드하는 데 사용한 클래스 집합이 있습니다. 아래 코드는 .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 파일에두면 동일한 코드가 작동합니다.

뭔가가 누락되었습니다. <%=AppDomain.CurrentDomain.ApplicationIdentity%>은 파일 시스템이나 사용자 지정 공급자에서 동일한 값을 반환하기 때문에 파일 시스템이나 사용자 지정 VirtualPathProvider에서 오는 스트림이 더 비슷합니다.로드 된 어셈블리가 있어야합니다.

답변

1

시도 동적 사용자 제어 문자열에

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

를 추가.

편집 : 물론

, 당신은 또한 MyApp.Model.Category()Model.Category()을 변경, 형식의 정규화 된 이름을 사용할 수 있습니다. 대부분의 경우 네임 스페이스를 가져옵니다. 스타일 선호.

0

모델 클래스의 모습은 어떻습니까? 그것은 어떤 네임 스페이스 안에 싸여 있습니까? VPP는 꽤 놀라운 일이며 많은 마법을 쓸 수 있습니다. 'asp.net'페이지 '콘텐츠로'문자열 '을 전달할 때 클래스에 전체 경로를 제공하면이 방법이 더 안전합니다. 또는 다른 옵션으로 web.config를 사용하여 네임 스페이스를 연결하면 앱에서 클래스를 찾을 수 있습니다.

+0

내 모델이다 기본적으로 공용 클래스 카테고리 { 공공 INT 이드가 {얻을; 설정;} 공공 문자열 제목 {얻을; 설정;} 공공 문자열 설명 {얻을; 설정을} 공공 부문의 부모 {얻을; 설정; } } 웹 응용 프로그램 web.config에 Model.Category 네임 스페이스를 추가했습니다. –

+0

내 수업의 전체 경로가 무엇을 의미하는지 확신 할 수 없습니다. –