【问题标题】:Html expressions as lambdas in razor - what's allowed, where is it documentedHtml 表达式作为 razor 中的 lambdas - 允许什么,它记录在哪里
【发布时间】:2016-11-24 22:13:43
【问题描述】:

我刚刚遇到了我完全错过的 Razor 中最棒的功能。

你可以定义

public delegate IHtmlString RazorBlock(Object unknown);

还有一些功能

public static IHtmlString Foo(RazorBlock block) => block(null);

然后用一块 Razor 调用它:

@(
    Helper.Foo(@<div>some text</div>)
)

内部的html实际上是Foo方法接收的内容。

我一直认为不支持在 lambda 中嵌套 Razor。但它是。 Razor 比我想象的要走得更远。

我唯一的问题:

我在查看 DevExtreme 的 ASP.NET MVC 包装器的示例时发现了这个功能,RazorBlock 的定义来自那里。

我不知道为什么unknown 参数是必要的(尽管如此)以及如何从 Razor sn-p 访问它。

【问题讨论】:

    标签: asp.net asp.net-mvc razor asp.net-mvc-5 asp.net-core-mvc


    【解决方案1】:

    我不知道为什么需要未知参数(尽管如此)以及如何从 Razor sn-p 访问它。

    通过查看已编译的 Razor 代码(可以在 %windir%\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files 下找到)很容易理解。

    例如,以下标记:

    @functions{ 
        public delegate IHtmlString RazorBlock(Object unknown);
    
        static object Helper(RazorBlock block) {
            return null;
        }
    }
    
    @Helper(@<text>
        multi-line
        text
    </text>)
    

    产生这个类:

    public class _Page_Views_Home_Index_cshtml : System.Web.Mvc.WebViewPage<dynamic> {
        public delegate IHtmlString RazorBlock(Object unknown);
    
        static object Helper(RazorBlock block) {
            return null;
        }
    
        // . . .
    
        public override void Execute() {
            // . . .
    
            Write(Helper(item => new System.Web.WebPages.HelperResult(__razor_template_writer => {            
                BeginContext(__razor_template_writer, "~/Views/Home/Index.cshtml", 174, 28, true);
                WriteLiteralTo(__razor_template_writer, "\r\n    multi-line\r\n    text\r\n");
                EndContext(__razor_template_writer, "~/Views/Home/Index.cshtml", 174, 28, true);
            })));
    
            // . . .
        }
    }
    

    编辑。您可以看到@&lt;text&gt;&lt;/text&gt; 块被转换为item =&gt; HelperResult lambdas。而object =&gt; IHtmlString 是与该代码兼容的最通用的委托签名。

    【讨论】:

      猜你喜欢
      • 2019-12-23
      • 1970-01-01
      • 2011-11-25
      • 2022-10-01
      • 2010-12-15
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多