首页 > 解决方案 > 是否可以在控制器内执行 ViewComponent 并将 HTML 存储为字符串

问题描述

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

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

我希望能够操纵要执行的视图组件结果,然后返回将发送到浏览器以显示的 HTML。然后我可以将其用作电子邮件正文。但是,在不知道结果视图的完整路径的情况下,我目前还没有接近获取 HTML

标签: c#asp.net-core-mvcasp.net-core-viewcomponent

解决方案


如本文中的一个答案中所述,我能够找到一种完全满足我需要的方法(将返回的 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.
  }
}

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


推荐阅读