- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我注意到 RazorEngine.Compile() 似乎以不同于其他类型的方式对待匿名类型。例如,考虑以下代码:
public static void Main()
{
try {
var model = new { s = default(string) };
RazorEngine.Razor.Compile("@Model.s.Length", model.GetType(), "a");
RazorEngine.Razor.Run(model, "a");
} catch (Exception ex) {
Console.WriteLine(ex); // RuntimeBinderException (Cannot perform runtime binding on a null reference)
}
try
{
var model = "";
RazorEngine.Razor.Compile(@"@Model.Length", model.GetType(), "b");
RazorEngine.Razor.Run(default(string), "b");
} catch (Exception ex) {
Console.WriteLine(ex); // NullReferenceException
}
try
{
var model = Tuple.Create(default(string));
RazorEngine.Razor.Compile(@"@Model.Item1.Length", model.GetType(), "c");
RazorEngine.Razor.Run(model, "c");
} catch (Exception ex) {
Console.WriteLine(ex); // NullReferenceException
}
try
{
var model = new Internal();
RazorEngine.Razor.Compile(@"@Model.S.Length", model.GetType(), "d");
RazorEngine.Razor.Run(model, "d");
} catch (Exception ex) {
Console.WriteLine(ex); // TemplateCompilationException (type Internal is not visible)
}
}
internal class Internal {
public string S { get; set; }
}
我的理解是:匿名类型是内部类型,因此通常 Razor 不会处理它们。但是,Razor 通过生成动态模板来为匿名类型提供特殊支持。
因此我有两个问题:(1) 我对这种行为的理解是否正确?(2) 有什么办法可以让razor输出一个匿名模型的强类型模板?
最佳答案
我有制作 Razor 组件的想法 a friend assembly到您的程序集(从而使内部结构可见),但这没有用。在Razor源码中,我们可以看到如下代码(在CompilerServiceBase.cs
中):
if (modelType != null)
{
if (CompilerServices.IsAnonymousType(modelType))
{
type.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(HasDynamicModelAttribute))));
}
}
然后(在 TemplateBaseOfT.cs
中):
HasDynamicModel = GetType().IsDefined(typeof(HasDynamicModelAttribute), true);
稍后在同一文件中使用:
if (HasDynamicModel && !(value is DynamicObject) && !(value is ExpandoObject))
model = new RazorDynamicObject { Model = value };
else
model = value;
是的 - 您的理解是正确的。此外,我们可以看到仅使内部结构可见是不够的,因为 Razor 将任何匿名类型视为动态类型(RazorDynamicObject
extends DynamicObject
)。如果包含程序集的内部可见,您可以尝试修补 Razor 代码以不将匿名类型视为动态类型。
不过,在那种情况下,我认为代码必须发出一个新的公共(public)类型,该类型包含与模型的匿名类型相同的属性,以便 Razor 生成的代码可以实例化该类型的实例。或者,您可以使用描述的 hack here为了允许方法返回匿名类型的实例。
关于c# - 为什么 RazorEngine 会动态编译带有匿名类型模型的模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14878997/
我的 RazorEngine 版本 3.6.3 有问题RazorEngine 无法从“字符串”转换为“RazorEngine.Templated.ITemplateKey” 我的代码如下:
我有一个控制台应用程序,它使用 RazorEngine 根据应用程序的运行发送电子邮件。我成功地能够在开发 IDE 中和通过可执行文件运行控制台应用程序发送电子邮件。但是,当我从计划任务运行控制台应用
当您调用 RazorEngine.Razor.Compile() ,编译后的模板存放在哪里? 程序重新启动后是否可用?如果内存不足,会被转储吗? 我正在使用 RazorEngine在 ASP.NET
我正在使用RazorEngine渲染一些基本内容(一个非常粗糙的内容管理系统)。 除非我在标记中包含任何@Html语法,否则它的效果很好。 如果标记包含@html,则会出现以下错误: Unable t
在我的页面中,我想显示这样的字符串: Today is (x)th of july 其中 (x) 由程序在运行时计算并作为@Model.Number 传递给 RazorEngine 但是下面的模板格式
目前,我正在使用 RazorEngine v2.1 作为发送模板化电子邮件(数千封)的后台进程的一部分。为了加快速度,模板以其 md5 和作为名称进行编译。这样一来,当模板更改时,它会被重新编译,并且
我正在尝试用这一行编译一个 razor 文件 RazorEngine.Razor.Parse("Hello world"); 但它只是抛出 base {System.Exception} = {"Un
我像这样使用 Razor 引擎: public class EmailService : IService { private readonly ITemplateService templa
我正在使用 Razor 引擎 https://github.com/Antaris/RazorEngine解析我的电子邮件模板的正文。是否可以定义布局并包含其他 .cshtml 文件?例如常见的页眉和
string templ = @"@Model.Name[0] @Model.Name[1]"; string result = RazorEngine.Razor.Parse(templ, new
我们有一个使用 RazorEngine 解析电子邮件内容并使用 Web API 客户端发送电子邮件的类库。 我们使用它通过控制台应用程序定期发送时事通讯。这非常有效,因为它每天可以发送 50k+ 封电
我正在使用 RazorEngine 构建一个电子邮件模板系统,并希望在与我的主模板不同的 cshtml 文件中维护辅助函数。例如,假设我有一个这样的文件夹结构: /Templates Supp
这是对 THIS 的更新问题是 V3 已经有一段时间了: 我也在考虑将 RazorEngine 用于邮件模板(甚至可能更多)。 现在是否有“足够的安全模式”可供用户定义模板? 使用 IsolatedT
当 razor 模板有一个包含在括号中的变量时(例如下面代码中的“(@Model.B)”),如果该变量前面有“ 标志来查找将用作 html 的标签。 要解决您的问题,您可以使用 < 的 xml 替换
我正在使用 Razor 引擎:https://github.com/Antaris/RazorEngine . 我正在动态创建模型。我试图在模板中包含一个扩展方法,但它会识别扩展类。我收到以下错误消息
我正在尝试使用 RazorEngine 将其他文件包含在模板中,但我有点卡住了。我掌握了基础知识,但我希望能够在我的模板中使用 @Include("somefile.html")。 这是我到现在为止得
我一直在尝试在我的一个小项目中使用 RazorEngine,但是当我尝试使用模板布局时无法克服这个错误。 Unable to compile template. 'object' does not c
是否可以知道特定模板是否已使用 RazorEngine 编译?基本上,如果您调用: Razor.Parse("Hello there @Model.Name", model, "hello-world
我注意到 RazorEngine.Compile() 似乎以不同于其他类型的方式对待匿名类型。例如,考虑以下代码: public static void Main() { try {
我有类似邮件合并的功能,它采用模板、一些业务对象,并生成 html,然后将其制作成 PDF。 我正在使用 RazorEngine将模板+模型做成 html 位。 如果我让用户指定模板,我要冒什么风险?
我是一名优秀的程序员,十分优秀!