Возможно ли, чтобы лямбда-функция содержала синтаксис 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>
2 ответов:
Да и нет. Нет, вы не можете просто кормить его пользовательской бритвой, потому что в этом контексте Вы имеете дело с прямым C# и что-то вроде
<div>не является допустимым C#. Однако вы можете построить объектIHtmlStringилиMvcHtmlStringв лямбде, а затем вернуть этот объект.Однако вам потребуется создать версии пользовательских элементов управления, которыевозвращают HTML по сравнению сотображают HTML. В принципе, подумайте о
Html.PartialvsHtml.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