使用Tagbuilder和stringbuilder渲染output.precontent的Taghelper问题

时间:2016-05-20 03:55:21

标签: asp.net-core asp.net-core-mvc

我尝试过这两种不同的方式..在论坛上也没有很多。

我正在努力创建一个自定义taghelper,在我前进的过程中慢慢构建它。它用于生成动态菜单,但是我没有从字符串生成器获得正确的输出。

我正在尝试为预备内容制作此内容:

        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">

这对于postcontent:

            </ul>
        </div>

我打算将它添加为output.precontent和output.postcontent。我还决定对每个标签使用tagbuilder方法,并将它们添加到stringbuilder,最后将其作为前面提到的precontent。这就是我想出来的。

        StringBuilder PreContentSb = new StringBuilder();

        StringBuilder PostContentSb = new StringBuilder();

        TagBuilder divTag = new TagBuilder("div");
        TagBuilder ul = new TagBuilder("ul");

        divTag.MergeAttribute("class", "navbar - collapse collapse");
        divTag.TagRenderMode = TagRenderMode.SelfClosing;

        ul.MergeAttribute("class", "nav navbar - nav");
        ul.TagRenderMode = TagRenderMode.SelfClosing;

        PreContentSb.Append(' ', 12);
        PreContentSb.Append(divTag.InnerHtml.ToString());
        PreContentSb.Append(Environment.NewLine);
        PreContentSb.Append(' ', 16);
        PreContentSb.Append(ul.ToString());
        PreContentSb.Append(Environment.NewLine);

        output.PreContent.SetContent(PreContentSb.ToString());

        PostContentSb.Append(' ', 16);
        PostContentSb.Append("</ul>");
        PreContentSb.Append(Environment.NewLine);
        PostContentSb.Append(' ', 12);
        PostContentSb.AppendLine("</div>");
        PreContentSb.Append(Environment.NewLine);

        output.PostContent.SetContent(PostContentSb.ToString());

taghelper只会在一个地方进行,所以我想我会缩进那个地方,例如&#34; PreContentSb.Append(&#39;&#39;,12);&#34; ..

我得到的问题是,当我查看页面来源时,我会得到以下标签:

          Microsoft.Extensions.Internal.BufferedHtmlContent&#xD;&#xA;                Microsoft.AspNet.Mvc.Rendering.TagBuilder&#xD;&#xA;                &lt;/ul&gt;            &lt;/div&gt;&#xD;&#xA;

首先它根本不渲染tagbuilt标签,其次不是引号和尖括号,而是显示实际的Character实体引用。

如何简单地显示引号,尖括号?

最后,如何在stringbuilder中渲染tagbuilder元素?

1 个答案:

答案 0 :(得分:1)

  1. TagBuilder没有覆盖ToString()。您必须使用WriteTo()来编写它的内容(即在TextWriter中)。

  2. 要防止转义,您必须返回HtmlString。检查我的答案here,了解如何返回未被模板引擎编码的刺痛。这个例子是关于属性的,但它应该让你知道如何做到这一点,即output.PostContent.SetContent(new HtmlString(PostContentSb.ToString()));