Asp.net 在razor-what';允许,在哪里记录
我刚刚看到了Razor中最棒的功能,我完全错过了 你可以定义Asp.net 在razor-what';允许,在哪里记录,asp.net,asp.net-mvc,razor,asp.net-mvc-5,asp.net-core-mvc,Asp.net,Asp.net Mvc,Razor,Asp.net Mvc 5,Asp.net Core Mvc,我刚刚看到了Razor中最棒的功能,我完全错过了 你可以定义 public delegate IHtmlString RazorBlock(Object unknown); 还有一些功能 public static IHtmlString Foo(RazorBlock block) => block(null); 然后用一把剃须刀叫它: @( Helper.Foo(@<div>some text</div>) ) @( Foo(@some text)
public delegate IHtmlString RazorBlock(Object unknown);
还有一些功能
public static IHtmlString Foo(RazorBlock block) => block(null);
然后用一把剃须刀叫它:
@(
Helper.Foo(@<div>some text</div>)
)
@(
Foo(@some text)
)
内部html实际上是方法Foo
接收的内容
我一直认为lambda's不支持嵌套剃须刀。但事实确实如此。剃刀比我想象的要远
我唯一的问题是:
我在查看DevExtreme的ASP.NETMVC包装中的示例时发现了这个特性,RazorBlock
的定义就来自于此
我不知道为什么unknown
参数是必需的(尽管如此),也不知道如何从Razor代码段访问它
我不知道为什么未知参数是必需的(尽管如此),以及如何从Razor代码段访问它
通过查看编译后的Razor代码(可以在%windir%\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET文件下找到)很容易理解
例如,以下标记:
@functions{
public delegate IHtmlString RazorBlock(Object unknown);
static object Helper(RazorBlock block) {
return null;
}
}
@Helper(@<text>
multi-line
text
</text>)
@函数{
公共委托IHtmlString RazorBlock(对象未知);
静态对象辅助对象(RazorBlock块){
返回null;
}
}
@助手(@
多线
文本
)
生成此类:
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);
})));
// . . .
}
}
public class\u Page\u Views\u Home\u Index\u cshtml:System.Web.Mvc.WebViewPage{
公共委托IHtmlString RazorBlock(对象未知);
静态对象辅助对象(RazorBlock块){
返回null;
}
// . . .
公共覆盖无效执行(){
// . . .
Write(Helper(item=>newsystem.Web.WebPages.HelperResult(\uuuRazor\uTemplate\uWriter=>{
BeginContext(模板编写器,“~/Views/Home/Index.cshtml”,174,28,true);
Writeleteralto(\r\n razor\u template\u writer,“\r\n多行\r\n文本\r\n”);
EndContext(模板编写器,~/Views/Home/Index.cshtml),174,28,true);
})));
// . . .
}
}
编辑。您可以看到,@
块被转换为item=>HelperResult
lambdas。而object=>IHtmlString
是与该代码兼容的最通用的代理签名