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#,而像 <div>
这样的东西不是有效的 C#。但是,您可以在 lambda 中构建一个 IHtmlString
或 MvcHtmlString
对象,然后返回 那个。
但是,您将需要创建 返回 HTML 与 呈现 HTML 的自定义控件版本。基本上,想想Html.Partial
和Html.RenderPartial
。前者实际写入响应,而后者仅返回一个MvcHtmlString
,可以随意呈现到页面。
【讨论】:
我确定这是问题所在,只是不知道是否有类似的解决方法。如果有办法以某种方式直接注入 Razor 语法,而不需要我的团队手动构建他们的字符串,那就太好了。目前,我只是实现了一个包装函数并混合在一个 Html.Partial 中。【参考方案2】:有可能,使用模板化 Razor 委托:
@
Func<dynamic, object> b = @<strong>@item</strong>;
<span>This sentence is @b("In Bold").</span>
@<text>...</text>
是格式。 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 语法并在视图中执行?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Razor——ASP.NET Razor - C#代码语法