2

我正在阅读这篇关于 razor 模板委托的优秀文章。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剃刀解析出来的保留关键字吗?可以在任何其他约定中使用吗?说@column@row或任何其他方式?

非常感谢。就像我说的,我对 razor 视图引擎如何在后台将模板语句转换为实际代码更感兴趣。

[编辑]。感谢 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>");
}

所以我看到 razor 自动解析出@<var></var>分成单独的字符串等,我关于“item.ProductName”的问题是..假设“item”是“Proudct”类型,那么下面是 razor 想要做什么?

首先,razor 解析用逗号“.”分隔的“@item.ProductName”,得到“item”和“ProductName”。

那么由于“动态”参数,.NET会在后台尝试查找“Product”项的“ProductName”属性值吗?

谢谢

4

1 回答 1

0

没关系。我不知道为什么我没有建立联系。

我问了另一个关于 DynamicObject DynamicObject 的问题?以下代码如何工作?和@Alxandr 解释了这一点关于“动态”。所以本质上,它变成了

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

所以本质上,“动态”参数在后台使用CSharpGetMemberBinder并通过反射,找出对象“Product”的“ProductName”。

剃须刀模板的设计非常出色

于 2013-07-27T19:13:10.853 回答