Генерация контента в View Component

Последнее обновление: 05.04.2022

В прошлых темах все классы компонентов представлений в качестве выходного результата использовали строку, то есть объект string. Однако такой тип для генерации результата не всегда является удобным, и обычно в качестве результата в View Component используется объект интерфейса IViewComponentResult. Имеется три встроенных класса, которые реализуют этот интерфейс:

  • ViewComponentResult: используется для генерации представления Razor с возможностью передачи модели. Для создания этого объекта может применяться метод View() класса ViewComponent

  • ContentViewComponentResult: применяется для отправки текстового контента. Для создания объекта используется метод Content()

  • HtmlContentViewComponentResult: представляет фрагмент кода HTML, который инкорпорируется в веб-станицу

ContentViewComponentResult

Для возврата содержимого в виде обычной строки используется объект ContentViewComponentResult. Для его создания применяется метод Content(), который в качестве параметра принимает строку.

В предыдущих темах метод Invoke компонента возвращал строку - объект string. По сути же возвращался тот же объект ContentViewComponentResult, так как фреймворк MVC автоматически преобразовывает строку в объект типа ContentViewComponentResult. Например:

using Microsoft.AspNetCore.Mvc;

namespace MvcApp.Components
{
    public class Timer : ViewComponent
    {
        public IViewComponentResult Invoke()
        {
            string time = $"Текущее время: {DateTime.Now.ToString("HH:mm:ss")}";
            return Content(time);
        }
    }
}

Стоит отметить, что в подобном случае необходимо наследовать класс компонента от ViewComponent, иначе мы не сможем воспользоваться методом Content().

Если эта форма определения компонента не является предпочтительной, то можно явным образом создать объект ContentViewComponentResult:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ViewComponents;

namespace MvcApp.Components
{
	[ViewComponent]
    public class Timer
    {
        public IViewComponentResult Invoke()
        {
            string time = $"Текущее время: {DateTime.Now.ToString("HH:mm:ss")}";
            return new ContentViewComponentResult(time);
        }
    }
}

При вызове компонента:

<div>
    @await Component.InvokeAsync("Timer")
</div>
<div>
    <vc:timer />
</div>

мы бы увидели в браузере ту же самую строку:

Генерация контента и тип IViewComponentResult в ASP.NET Core MVC и C#

HTML-фрагменты

Для генерации html-фрагментов, которые вставляются в основное представление, применяется класс HtmlContentViewComponentResult. Для создания html-содержимого в конструктор этого класса передается объект HtmlString с кодом html:

using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ViewComponents;

namespace MvcApp.Components
{
    [ViewComponent]
    public class Timer
    {
        public IViewComponentResult Invoke()
        {
            return new HtmlContentViewComponentResult(
                new HtmlString($"<p>Текущее время:<b>{DateTime.Now.ToString("HH:mm:ss")}</b></p>")
            );
        }
    }
}

В отличие от ContentViewComponentResult все html-теги будут должным образом интерпретироваться:

View Component и HtmlContentViewComponentResult в ASP.NET Core MVC и C#

Данный способ удобен, когда необходимо возвратить какой-то небольшой кусочек кода html для вставки на веб-страницу. Если же надо сгенерировать довольно много разметки html, то в этом случае лучше использовать ViewComponentResult, который будет рассмотрен в следующей теме.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850