代码之家  ›  专栏  ›  技术社区  ›  haferje

lambda函数是否可以包含Razor语法并在View中执行?

  •  6
  • haferje  · 技术社区  · 10 年前

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

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

    以下是模拟我当前布局的简化示例代码。重点的特定部分是 渲染侧内容 方法定义及其执行调用。

    索引.cshtml

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

    自定义控件.shtml

    <div>
        @Model.AreaTitle
        <div class="my-custom-content">
            @Model.RenderSideContent()
        </div>
    </div>
    
    2 回复  |  直到 10 年前
        1
  •  3
  •   Chris Pratt    10 年前

    是的,也不是。不,你不能这样自定义Razor,因为在这种情况下,你要处理的是直接的C#之类的东西 <div> 不是有效的C#。然而,你 可以 构建 IHtmlString MvcHtmlString 对象,然后返回 那个 .

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

        2
  •  2
  •   Community Mohan Dere    9 年前

    使用模板化剃刀代表可以:

    @{
      Func<dynamic, object> b = @<strong>@item</strong>;
    }
    <span>This sentence is @b("In Bold").</span>
    

    @<text>...</text> 是格式。剃刀编译器将创建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?