是否可以在 asp.net 之外使用 Razor View Engine

Posted

技术标签:

【中文标题】是否可以在 asp.net 之外使用 Razor View Engine【英文标题】:Is it possible to use Razor View Engine outside asp.net 【发布时间】:2011-04-07 10:22:52 【问题描述】:

如果我查看 Razor 视图引擎,我会看到一个非常简洁的语法,它与生成 html 没有特别的关联。所以我想知道,在“普通”.net 环境中使用 asp.net 之外的引擎有多容易,例如生成文本、代码……

欢迎任何指针、示例、评论或解释。

【问题讨论】:

【参考方案1】:

这里有两个问题:

    是的,您可以在 ASP.NET 应用程序域的上下文之外运行 Razor 视图引擎,如 Andrew 的博客中所述:http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of-aspnet-revised-for-mvc3-rc.html 但是,Razor 仍然主要专注于生成类似 xml 的标记(例如 HTML),因为 Razor 解析器使用 <tags> 的存在来确定代码和标记之间的转换。您可能可以使用它来生成任何文本,但是当您的输出与 Razor 关于您的意图的假设不匹配时,您可能会遇到问题。

例如,虽然这是有效的 Razor 代码(因为 <div> 标记):

@if(printHello) 
   <div>Hello!</div>

以下 sn-p 无效(因为 Hello! 仍被视为代码):

@if(printHello) 
   Hello!

但是有一个特殊的&lt;text&gt; 标记可用于强制多行块的过渡(&lt;text&gt; 标记不会被渲染):

@if(printHello) 
   <text>Hello!
   Another line</text>

还有一个更短的语法可以使用 @: 强制转换单行:

@if(printHello) 
   @:Hello!

【讨论】:

嗯,我正在考虑使用它来生成电子邮件或即时 IronPython 代码生成等内容。由于这些不使用标签,因此最好查看其他替代方案。感谢您的回答。 @Thomas Razor 在这些情况下应该做得很好,你只需要添加那些神奇的&lt;text&gt; 标签或不时使用@:。一旦 VS 编辑器支持 Razor 语法,就很容易判断何时发生转换。【参考方案2】:

检查RazorEngine,这是一个建立在 Razor 之上的小框架,可让您执行此操作。

【讨论】:

在 .net 4 目标应用程序上安装此项目时遇到问题,需要更新。【参考方案3】:

看看RazorTemplates 库。它比 RazorEngine 库更轻量级,它是线程安全的,并且具有非常好的最小接口。

编译和渲染模板就像两行代码一样简单:

var template = Template.Compile("Hello @Model.Name!");
Console.WriteLine(template.Render(new  Name = "World" ));

【讨论】:

您是否正在强调 RazorTemplates b/c 的线程安全性,对于这个问题的其他建议解决方案之一不是吗?我对 RazorEngine 特别感兴趣。【参考方案4】:

RazorEngineRazorTemplates 都已在此处提及,但请查看 RazorMachine。您可以简单地将您的非 MVC 应用程序指向(另一个)现有 MVC 应用程序的 ~/Views 文件夹,通过发送正确的模型执行并在 2 行代码上获得渲染输出:

var sb = new StringBuilder();

//RazorMachine magic:
//*tweets* is basically List<TwitterPost> - simple collection of custom POCO
//first param for rm.ExecuteUrl points to ~/Views folder, MVC style
var rm = new RazorMachine(htmlEncode: false);
ITemplate template = rm.ExecuteUrl("~/twitter/twitter", tweets);

//do whatever you want with result
sb.Append(template);

【讨论】:

【参考方案5】:

生成代码或文本:您的意思是像 T4 模板:http://msdn.microsoft.com/en-us/library/bb126445.aspx 或 codesmith 工具?

【讨论】:

这需要点赞,因为 T4 与 Razor 有相似之处,并且是一个实际的通用代码生成器,作为 Visual Studio 中的一个功能开箱即用 - 本质上它是一个通用的“Razor”跨度> 据我了解,T4模板只能在编译时更改,将.tt文件转换为.cs文件保存。在我的使用中,半技术用户希望更新模板而无需重新构建应用程序。有没有一种简单的方法可以使用 T4 模板来实现? 很可能,只要它生成的任何东西都可以被解释,就像 CSHTML 可以在运行时由 Razor 引擎解释。您也可以通过编程方式触发它来生成代码,但编译后的代码必须由编译器解析才能使用......

以上是关于是否可以在 asp.net 之外使用 Razor View Engine的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASP.NET 核心 MVC/Razor 站点和 WebAPI 进行授权

如何在 asp.net core razor 页面中拒绝匿名用户?

我们可以在 ASP.NET Webforms(*.aspx 页面)中使用 Razor 语法吗?

将数据从 javascript 传递到 asp.net core 2 razor 页面方法

在Visual Basic.NET(VB.NET)中开发的ASP.NET Core应用程序,可以吗? VS

尝试从 ASP.NET Core MVC Razor 中的 _Layout 页面重定向时出错