像Telerik一样流畅的控制写作:理解尖括号的翻译

时间:2010-11-08 15:29:35

标签: c# asp.net asp.net-mvc controls viewengine

这是一节课:

public class OneControl
{
    ...

    public OneControl Content(Action value) {
        ContentProperty = value;
        return this;
    }

    public void Render()
    {
        ContentProperty();
    }

    ...
}

然后我在我的观点中得到了这个:

<div id="pleaseHelpMe">
    <% OneControlInstance.Content(() => { %> 
        Some Mixed Stuff <%= Example%> Euros
    <% }).Render() %>
</div>

我想在我的UI库中使用这种语法,我知道如何实现它,但我不知道它实际上是如何工作的!

我理解某个地方和某个委托是作为方法内容的参数创建和提供的,但无法找到有关此机制或技术的任何信息。

你能点燃我吗?

PS:我会根据我得到的anwser更改标题。

假设当前正确答案

编译器将下面的aspx代码转换为(理解的符号翻译):

<div id="pleaseHelpMe">
    <% OneControlInstance.Content(() => {
        ViewPageInstance.Response.Write("Some Mixed Stuff ");
        ViewPageInstance.Response.Write(Example);
        ViewPageInstance.Response.Write(" Euros");
    }).Render() %>
</div>

非常感谢Hogan !!

2 个答案:

答案 0 :(得分:1)

() => { %> Some Mixed Stuff <%= Example%> Euros <% }是代表。

在.NET aspx页面中,%> <%之外的东西(html东西)在编译aspx页面时会被翻译成output.render(string)

所以这和委托代码相同:

() => 
{ 
  output.render(" Some Mixed Stuff "); 
  output.render(Example); 
  output.render(" Euros "); 
}

之前的评论:

不确定你在问什么。 Action value是代表。来自文档:

http://msdn.microsoft.com/en-us/library/018hxwa8.aspx

“封装具有单个参数且不返回值的方法。”

“您可以使用Action(<T>)委托将方法作为参数传递,而无需明确声明自定义委托。”


如果您希望代理人返回一个值,您可以使用TResult Func<in T, out TResult>

答案 1 :(得分:1)

ContentControls有一个ContentProperty field,它本质上是一个委托。您的类通过fluent interface(基本上是Content方法的return this部分)设置此值 - 这只是一种使开发更容易,本身没有任何超级相关性的方式 - 并且这个委托可以被执行通过Render方法,这是控制生命周期的一部分。

您可能遗漏的一点是您在此标记中提供了代理人action

<% OneControlInstance.Content(() => { %>   
        Some Mixed Stuff <%= Example%> Euros  
    <% }).Render() %> 

动作就是内容方法调用中的所有内容,即() => { stuff },您可以尝试将其作为匿名函数读取,并在大括号和函数代码之间插入参数。