2011-02-03 11 views
2

ディスク上のファイルから来る必要はなく、文字列からビューを返す便利な方法はありますか?ASP.NET MVC3 Razor - 文字列からビューを作成しますか?

データベースからビューを取得するカスタムVirtualPathProviderを実装しましたが、ビューをデータベースに保存する必要はありません。

アップデート2011年2月15日

私はcode.I'veにカミソリビューをコンパイルするプロセスは、このコンポーネントで仮想パスプロバイダのコードの多くを交換し、それが働いて簡素化very nice open source componentに出くわし信じられないほどうまく。私は、仮想パスプロバイダの追加機能を必要としないデータベースや他の場所からビューをコンパイルしようとしている人には、それをお勧めします。このコンポーネントを使用すると、VPPフープをジャンプすることなく、コントローラ/アプリケーション/任意のもの(Webコンテキストとコントローラコンテキストは不要)内でビューを直接コンパイルできます。

答えて

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のメソッドをオーバーライドする必要があります:

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); 
    } 
} 
関連する問題