gpt4 book ai didi

asp.net - Html 表达式作为 razor 中的 lambda - 允许什么,记录在哪里

转载 作者:行者123 更新时间:2023-12-02 15:12:18 26 4
gpt4 key购买 nike

我刚刚发现了 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 代码段访问它。

最佳答案

I don't know why the unknown parameter is necessary (it is though) and how it can be accessed from the Razor snippet.

通过查看编译后的 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);
})));

// . . .
}
}

编辑。你可以看到@<text></text> block 被转换为 item => HelperResult lambda 。和object => IHtmlString是与该代码兼容的最通用的委托(delegate)签名。

关于asp.net - Html 表达式作为 razor 中的 lambda - 允许什么,记录在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38502199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com