我正在努力更好地理解视图组件的“幕后”。我知道标准方法是使用
调用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字符串?
答案 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
,以便视图的其余部分正确呈现。