Почему метод ViewComponentResult.ExecuteResult возвращает void? - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь лучше понять "за кадром" на компонентах представления. Я знаю, что стандартный подход - вызывать ViewComponent с помощью

 @await Component.InvokeAsync("MyViewComponent", itsModel) 

или вспомогательный тег просмотра компонента в файле .cshtml.

Однако можно использовать компоновки представлений другими способами. Так, например, вы можете вернуть представление непосредственно из контроллера, используя return ViewComponent("MyViewComponent", itsModel); из метода действия.

Похоже, что должна быть возможность легко визуализировать компонент вида в строку. Я вижу, что в ViewComponetResult, возвращаемом ViewComponent("MyViewComponent", itsModel);, есть метод ExecuteResult.

В контроллере это можно назвать так:

 ViewComponent("MyViewComponent", itsModel).ExecuteResult(this.ControllerContext);

На первый взгляд, я ожидаю, что такой метод вернет строку html. Но это возвращает пустоту. Зачем? Что делает ViewComponentResult.ExecuteResult, если не возвращает результат? И как я могу сделать ViewComponentResult в строку HTML?

1 Ответ

0 голосов
/ 08 мая 2018

Я, наконец, понимаю, как это работает. Комментарий @ TavisJ - это то, что подсказало мне и направило меня в правильном направлении.

В ViewComponentResult или более универсально, в any ActionResult ExecuteResult возвращает void, поскольку вывод ViewComponent записывается в связанный HttpResponse.Body. Это верно и для асинхронной версии вызова, за исключением того, что, конечно, она возвращает задачу.

Так, например, если человек должен был сделать следующий звонок:

  await ViewComponent("MyViewComponent", itsModel).ExecuteResultAsync(this.ControllerContext);

для захвата «вывода» компонента представления сначала необходимо заменить this.ControllerContext.HttpResponse.Response.Body выбранным потоком, прежде чем делать вызов ExecuteResultAsync, чтобы вывод захватывался в потоке, который затем может быть преобразован в строку.

Тогда, конечно, исходный поток должен быть возвращен на this.ControllerContext.HttpResponse.Response.Body, чтобы остальная часть представления отображалась правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...