剃刀模板委托,内部如何工作

本文关键字:何工作 工作 内部 剃刀 | 更新日期: 2023-09-27 18:25:07

我正在阅读这篇关于剃刀模板委托的优秀文章。http://www.prideparrot.com/blog/archive/2012/9/simplifying_html_generation_using_razor_templates

虽然我了解它是如何使用的,就像在中一样

Func<dynamic, HelperResult> variable = @<var>@item.ProductName</var>

我的问题是,剃刀引擎究竟是如何在后台将"@<var>@item.ProductName</var>"翻译成代表的?如

Func<dynamic, HelperResult> variable = delegate(dynamic x)
{
   (what goes on in here?)
}

@item是剃刀解析出来的保留关键字吗?它可以用于任何其他公约吗?比如CCD_ 3或CCD_?

非常感谢。正如我所说,我更感兴趣的是剃刀视图引擎如何在后台将模板语句转换为实际代码。

[编辑]。感谢Brad指出Andrew的文章。所以上面的语句"@<var>@item</var>"将转化为

Func<dynamic, HelperResult> variable = delegate(dynamic item)
{
     return new Microsoft.WebPages.Helpers.HelperResult(__writer => {
     @__writer.Write(" ");
     @__writer.Write("<var>");
     @__writer.Write(item.ProductName);     <--- what's happening here?
     @__writer.Write("</var>");
}

因此,我看到剃刀自动将@<var></var>解析为单独的字符串,因此,我关于"item.ProductName"的问题是……假设"item"是"Proudct"类型,那么下面是剃刀想要做的吗?

首先,razor解析用逗号"."分隔的"@item.ProductName",得到"item"answers"ProductName"。

然后,由于"dynamic"参数,.NET将在后台尝试查找项"Product"的属性"ProductName"的值?

感谢

剃刀模板委托,内部如何工作

没关系。我不知道为什么我没有接通。

我问了另一个关于DynamicObject的问题DynamicObject?以下代码是如何工作的?@Alxandr就"动态"对此进行了解释。所以本质上,它变成了

dynamic item = new Product(...);
String ProductName = item.ProductName;

所以从本质上讲,后台的"dynamic"参数使用CSharpGetMemberBinder,通过反射,计算出对象"Product"的"ProductName"。

剃刀模板有一个非常出色的设计