lambda 函数是不是可以包含 Razor 语法并在视图中执行?

Posted

技术标签:

【中文标题】lambda 函数是不是可以包含 Razor 语法并在视图中执行?【英文标题】:Is it possible for a lambda function to contain Razor syntax and be executed in a View?lambda 函数是否可以包含 Razor 语法并在视图中执行? 【发布时间】:2015-10-22 02:33:01 【问题描述】:

是否可以使用 Razor 语法定义 lambda 表达式(delegate、Action、Func)的内容,以便在视图中执行此模型方法时,将插入该 Razor 内容?

这样做的目的是让我们的开发人员能够定义他们自己的自定义内容,以插入到 CustomControl 视图中的特定点。

以下是模仿我当前布局的精简示例代码。重点关注的特定部分是 RenderSideContent 方法定义及其执行调用。

索引.cshtml

@model My.PageModel

@My.CustomControl(new CustomControlModel
    
        AreaTitle = "Details",
        RenderSideContent = () =>
        
            <div>
                @using (My.CustomWrapper("General"))
                
                    My.BasicControl(Model.Controls[0])
                
            </div>
        
    )

CustomControl.cshtml

<div>
    @Model.AreaTitle
    <div class="my-custom-content">
        @Model.RenderSideContent()
    </div>
</div>

【问题讨论】:

【参考方案1】:

是和不是。不,您不能像那样只为它提供自定义 Razor,因为在这种情况下,您正在处理直接的 C#,而像 &lt;div&gt; 这样的东西不是有效的 C#。但是,您可以在 lambda 中构建一个 IHtmlStringMvcHtmlString 对象,然后返回 那个

但是,您将需要创建 返回 HTML 与 呈现 HTML 的自定义控件版本。基本上,想想Html.PartialHtml.RenderPartial。前者实际写入响应,而后者仅返回一个MvcHtmlString,可以随意呈现到页面。

【讨论】:

我确定这是问题所在,只是不知道是否有类似的解决方法。如果有办法以某种方式直接注入 Razor 语法,而不需要我的团队手动构建他们的字符串,那就太好了。目前,我只是实现了一个包装函数并混合在一个 Html.Partial 中。【参考方案2】:

有可能,使用模板化 Razor 委托:

@
  Func<dynamic, object> b = @<strong>@item</strong>;

<span>This sentence is @b("In Bold").</span>

@&lt;text&gt;...&lt;/text&gt; 是格式。 razor 编译器将创建一个 lambda 表达式。目前我正在使用 ASP.Net Core,所以它看起来像这样:

item => new Microsoft.AspNetCore.Mvc.Razor.HelperResult(async(__razor_template_writer) => ...

所以这应该有效:

@model My.PageModel

@My.CustomControl(new CustomControlModel
    
        AreaTitle = "Details",
        RenderSideContent =
            @<div>
                @using (My.CustomWrapper("General"))
                
                    My.BasicControl(Model.Controls[0])
                
            </div>
    )

http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx/

另见:Are lambda expressions supported by Razor?

【讨论】:

以上是关于lambda 函数是不是可以包含 Razor 语法并在视图中执行?的主要内容,如果未能解决你的问题,请参考以下文章

Lambda 无效语法

Razor 语法

ASP.NET Razor——ASP.NET Razor - C#代码语法

c++基础(lambda)

asp mvc razor 存储 lambda 表达式以列出并重用它

asp.net mvc学习