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

时间:2013-07-27 17:33:50

标签: c# asp.net-mvc-4 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 razor解析出来的保留关键字吗?它可以用于任何其他惯例吗?说@column@row或其他任何方式?

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

[编辑]。感谢布拉德指出安德鲁的文章。所以上述陈述“@<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”的问题是..suppose“item”是“Proudct”类型那么剃刀正在尝试做什么?

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

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

由于

1 个答案:

答案 0 :(得分:0)

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

我问了关于DynamicObject DynamicObject? How does the following code work?的另一个问题,@ Alxandr解释了这个关于&#34; dynamic&#34;。基本上,它变成了

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

所以从本质上讲,&#34;动态&#34;后台参数使用CSharpGetMemberBinder并通过反射,找出&#34; ProductName&#34;对象&#34;产品&#34;。

razor模板设计非常精彩