【问题标题】:ASP.NET MVC3 Razor - create view from a string?ASP.NET MVC3 Razor - 从字符串创建视图?
【发布时间】:2011-02-03 18:20:32
【问题描述】:

有没有一种方便的方法可以从字符串返回视图,而不必从磁盘上的文件中返回?

我已经实现了一个自定义 VirtualPathProvider 来处理从数据库中检索视图,但我并不总是希望将视图存储在数据库中。

2011 年 2 月 15 日更新

我偶然发现了一个very nice open source component,它简化了在代码中编译 Razor 视图的过程。我已经用这个组件替换了大部分虚拟路径提供程序代码,并且它运行得非常好。我向任何试图从数据库或其他地方编译视图且不需要虚拟路径提供程序的附加功能的人推荐它。该组件让您可以直接在您的控制器/应用程序/任何内容中编译视图(不需要 Web 上下文和控制器上下文),而无需跳过 VPP 箍。

【问题讨论】:

    标签: view asp.net-mvc-3 razor


    【解决方案1】:

    您可以通过创建RazorTemplateEngine 自己运行视图,该RazorTemplateEngine 会读取您的源代码并编译成WebViewPage

    然后您可以通过编写运行WebViewPage

    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);
    

    对于support the new @model keyword,您需要覆盖 RazorEngineHost 中的方法才能使用 MVC 的自定义生成器:

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      相关资源
      最近更新 更多