为什么ViewComponentResult.ExecuteResult方法返回void?

时间:2018-05-03 22:29:09

标签: c# asp.net-core-mvc asp.net-core-mvc-2.0

我正在努力更好地理解视图组件的“幕后”。我知道标准方法是使用

调用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 :(得分:0)

我终于明白这是如何运作的。 @TavisJ的评论让我感到惊讶,并让我研究正确的方向。

ViewComponentResult或更普遍地,在任何 ActionResult上,ExecuteResult返回void,因为ViewComponent的输出已写入关联HttpResponse.Body。对于调用的异步版本也是如此,当然它返回一个Task。

例如,如果一个人要拨打以下电话:

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

要捕获视图组件的“输出”,首先需要在进行this.ControllerContext.HttpResponse.Response.Body调用之前用他们选择的流替换ExecuteResultAsync,以便在流中捕获输出然后可以转换为字符串。

然后,当然,原始流应该放回this.ControllerContext.HttpResponse.Response.Body,以便视图的其余部分正确呈现。