是否可以在控制器内执行 ViewComponent 并将 HTML 存储为字符串

Gra*_*les 3 c# asp.net-core-mvc asp.net-core-viewcomponent

我目前有几个在许多不同地方使用的视图组件。我希望能够将调用视图组件时生成的 HTML 存储到字符串变量中,以便我可以将 HTML 用于其他目的(例如电子邮件)。

我查看了问题和帖子,但无法找到符合我需求的问题和帖子。我目前已存储 ViewComponentResult 供使用,但 ExecuteResult() 返回 void,因此无法使用它。

我希望能够操纵要执行的视图组件结果,然后返回将发送到浏览器进行显示的 HTML。然后我可以使用它作为电子邮件正文。然而,如果不知道结果视图的完整路径,我目前还无法接近获取 HTML

Gra*_*les 5

我找到了一种完全符合我需要的方法(以字符串形式获取返回的 HTML),如本文的一个答案中所述。

我使用的代码块是..

public async Task<string> RenderViewComponent(string viewComponent, object args) {

  var sp = HttpContext.RequestServices;

  var helper = new DefaultViewComponentHelper(
    sp.GetRequiredService<IViewComponentDescriptorCollectionProvider>(),
    HtmlEncoder.Default,
    sp.GetRequiredService<IViewComponentSelector>(),
    sp.GetRequiredService<IViewComponentInvokerFactory>(),
    sp.GetRequiredService<IViewBufferScope>());

  using (var writer = new StringWriter()) {
    var context = new ViewContext(ControllerContext, NullView.Instance, ViewData, TempData, writer, new HtmlHelperOptions());
    helper.Contextualize(context);
    var result = await helper.InvokeAsync(viewComponent, args);
    result.WriteTo(writer, HtmlEncoder.Default);
    await writer.FlushAsync();
    return writer.
  }
}
Run Code Online (Sandbox Code Playgroud)

该图显示了调试期间返回的变量