2011-02-03 5 views
2

디스크의 파일에서 가져 오는 대신 문자열에서보기를 반환하는 편리한 방법이 있습니까?ASP.NET MVC3 면도기 - 문자열에서보기 만들기?

데이터베이스에서 뷰를 검색하는 사용자 정의 VirtualPathProvider을 구현했지만 뷰가 데이터베이스에 저장되는 것을 항상 원하지는 않습니다.

업데이트 2011년 2월 15일

나는이 구성 요소와 code.I've의 가상 경로 제공자 코드의 많은 부분을 면도기보기 대체 컴파일하는 과정을 단순화하는 very nice open source component을 우연히 발견하고는 일하고있어 믿을 수 없을만큼 잘. 필자는 가상 경로 공급자의 추가 기능이 필요하지 않은 데이터베이스 또는 다른 곳에서보기를 컴파일하려는 모든 사람에게 권장합니다. 이 구성 요소를 사용하면 VPP 프레임을 건너 뛰지 않고도 컨트롤러/응용 프로그램/기타 (웹 컨텍스트 및 컨트롤러 컨텍스트가 필요하지 않음) 내에서 직접보기를 컴파일 할 수 있습니다.

답변

1

소스를 읽고 WebViewPage으로 컴파일하는 RazorTemplateEngine을 만들어 직접보기를 실행할 수 있습니다.

그런 다음 support the new @model keyword

webViewPage.OverridenLayoutPath = LayoutPath; 
webViewPage.VirtualPath = ViewPath; 
webViewPage.ViewContext = viewContext; 
webViewPage.ViewData = viewContext.ViewData; 

webViewPage.InitHelpers(); 
WebPageRenderingBase startPage = null; 
if (RunViewStartPages) { 
    startPage = StartPageLookup(webViewPage, RazorViewEngine.ViewStartFileName, ViewStartFileExtensions); 
} 
webViewPage.ExecutePageHierarchy(new WebPageContext(context: viewContext.HttpContext, page: null, model: null), writer, startPage); 

를 작성하여 WebViewPage를 실행할 수 있습니다, 당신은 MVC의 사용자 정의 생성기 사용하도록 RazorEngineHost의 메소드 오버라이드 (override)해야합니다 :

public override RazorCodeGenerator DecorateCodeGenerator(RazorCodeGenerator incomingCodeGenerator) { 
    if (incomingCodeGenerator is CSharpRazorCodeGenerator) { 
     return new MvcCSharpRazorCodeGenerator(incomingCodeGenerator.ClassName, 
               incomingCodeGenerator.RootNamespaceName, 
               incomingCodeGenerator.SourceFileName, 
               incomingCodeGenerator.Host); 
    } 
    else if (incomingCodeGenerator is VBRazorCodeGenerator) { 
     return new MvcVBRazorCodeGenerator(incomingCodeGenerator.ClassName, 
              incomingCodeGenerator.RootNamespaceName, 
              incomingCodeGenerator.SourceFileName, 
              incomingCodeGenerator.Host); 
    } 
    return base.DecorateCodeGenerator(incomingCodeGenerator); 
} 

public override ParserBase DecorateCodeParser(ParserBase incomingCodeParser) { 
    if (incomingCodeParser is CSharpCodeParser) { 
     return new MvcCSharpRazorCodeParser(); 
    } 
    else if (incomingCodeParser is VBCodeParser) { 
     return new MvcVBRazorCodeParser(); 
    } 
    else { 
     return base.DecorateCodeParser(incomingCodeParser); 
    } 
} 
관련 문제