Возможно ли, чтобы лямбда-функция содержала синтаксис Razor и выполнялась в представлении?



Можно ли определить содержимое лямбда-выражения (делегат, действие, функция) с помощью синтаксиса Razor, чтобы при выполнении этого модельного метода в представлении он вставлял это содержимое 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>
543   2  

2 ответов:

Да и нет. Нет, вы не можете просто кормить его пользовательской бритвой, потому что в этом контексте Вы имеете дело с прямым C# и что-то вроде <div> не является допустимым C#. Однако вы можете построить объект IHtmlString или MvcHtmlString в лямбде, а затем вернуть этот объект.

Однако вам потребуется создать версии пользовательских элементов управления, которыевозвращают HTML по сравнению сотображают HTML. В принципе, подумайте о Html.Partial vs Html.RenderPartial. Первый фактически пишет в ответ в то время как последний просто возвращает MvcHtmlString, который может быть отображен на странице по желанию.

Можно, используя шаблонные делегаты Razor:

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

@<text>...</text> есть формат. Компилятор razor создаст лямбда-выражение. В данный момент я использую ASP.Net ядро, поэтому оно выглядит так:

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/

Смотрите также: поддерживаются ли Razor лямбда-выражения?

Comments

    Ничего не найдено.