Is it possible for a lambda function to contain Razor syntax and be executed in a View?

不羁岁月 提交于 2021-02-18 12:32:05

问题


Is it possible to define the contents of a lambda expression (delegate, Action, Func<>) with Razor syntax, so that when this model method is executed in the view, it will insert that Razor content?

The intended purpose of this is for our developers to be able to define their own custom content to be inserted at a particular point in the CustomControl's view.

The following is stripped-down example code that mimics my current layout. The particular parts of focus are the RenderSideContent method definition and its executing call.

Index.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:


Yes and no. No, you can't just feed it custom Razor like that, because in that context, you're dealing with straight C# and something like <div> is not valid C#. However, you can build an IHtmlString or MvcHtmlString object in the lambda and then return that.

However, you're going to need to create versions of your custom controls that return HTML versus render HTML. Basically, think of Html.Partial vs Html.RenderPartial. The former actually writes to the response while the latter merely returns an MvcHtmlString that can be rendered to the page at will.




回答2:


It is possible, using Templated Razor Delegates:

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

@<text>...</text> is the format. The razor compiler will create a lambda expression. At the moment I'm using ASP.Net Core, so it looks like this:

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

So this should work:

@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/

See also: Are lambda expressions supported by Razor?



来源:https://stackoverflow.com/questions/31728779/is-it-possible-for-a-lambda-function-to-contain-razor-syntax-and-be-executed-in

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!