Asp.net mvc 将ViewComponent视图作为HTMLString返回,以便在其他ViewComponent中进行操作

Asp.net mvc 将ViewComponent视图作为HTMLString返回,以便在其他ViewComponent中进行操作,asp.net-mvc,razor,asp.net-core,Asp.net Mvc,Razor,Asp.net Core,我们正在构建一个定制的报告引擎,它构建在razor之上,供我们自己内部使用,到目前为止,一切都进展顺利。然而,我们已经开始将初始原型代码分解为ReportViewer视图中的函数,以简化维护,但我们遇到了一些问题 原始原型代码以非常简化的形式显示,如下所示: @foreach (var widget in Model.ReportWidgets) { var longSide = Model?.DisplayOptions?.DisplayMedium?.Long ?? 0; v

我们正在构建一个定制的报告引擎,它构建在razor之上,供我们自己内部使用,到目前为止,一切都进展顺利。然而,我们已经开始将初始原型代码分解为ReportViewer视图中的函数,以简化维护,但我们遇到了一些问题

原始原型代码以非常简化的形式显示,如下所示:

@foreach (var widget in Model.ReportWidgets)
{
    var longSide = Model?.DisplayOptions?.DisplayMedium?.Long ?? 0;
    var units = Model?.DisplayOptions?.DisplayMedium?.Units ?? "px";
    var height = widget.Rows * (longSide / Model.RowsPerPage);
    var width = widget.Columns / Model.Columns * 100;
    <div style="float: left;height: @(height)@(units); width: @(width)%">
        @(await InvokeComponent(widget))
    </div>    
}
我们正在有效地将其分解为看起来更像:

public async Task<HtmlString> BuildContainer(IReportWidget widget)
{
    var longSide = Model?.DisplayOptions?.DisplayMedium?.Long ?? 0;
    var units = Model?.DisplayOptions?.DisplayMedium?.Units ?? "px";
    var height = widget.Rows * (longSide / Model.RowsPerPage);
    var width = widget.Columns / Model.Columns * 100;
    var openDeclaration = $"<div style='float:left;height: {height}{units};width: {width}>";
    var component = await InvokeComponent(widget);
    var closeDeclaration = "</div>";

    return new HtmlString(openDeclaration + component + closeDeclaration); 
}

public async Task<IHtmlContent> InvokeComponent(IReportWidget widget)
{
    return await Component.InvokeAsync("AnalyticsWidget", new {widget = widget});
}
但是,由于ViewComponent返回IViewComponentResult,因此在我们的HtmlString中不会清晰地呈现。相反,它只是将Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ViewBuffer替换为ViewComponent

我们怎样才能让它和razor一起工作


作为参考,我们正在从基于Javascript的客户端版本移植系统。本质上,它们是相同的,但是这个版本将在服务器端而不是客户端加载所有组件。

在我看来,如果您能够将InvokeComponent的结果转换为字符串,那么这个问题应该得到解决。那么,为什么不尝试以下方法从IHtmlContent获取字符串:

System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.IO.StringWriter writer = new System.IO.StringWriter(sb);
System.Text.Encoding asciiEncoding = System.Text.Encoding.ASCII;
System.Text.Encodings.Web.HtmlEncoder hEncoder= System.Text.Encodings.Web.HtmlEncoder.Default;
component.WriteTo(writer, hEncoder);
String htmlString = writer.toString();