首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将ViewComponent视图作为HtmlStrings返回,以便在其他ViewComponents中进行操作

将ViewComponent视图作为HtmlStrings返回,以便在其他ViewComponents中进行操作
EN

Stack Overflow用户
提问于 2018-07-13 05:20:33
回答 1查看 401关注 0票数 0

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

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

代码语言:javascript
复制
@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>    
}

我们正在有效地尝试将其分解成更像下面这样的函数:

代码语言:javascript
复制
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中不能清晰地呈现。相反,它只是在ViewComponent的位置吐出Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ViewBuffer

我们该如何让它与razor一起工作呢?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-13 06:17:35

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

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51314617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档