ASP.NET 5 MVC 6中的TagBuilder InnerHtml
在我看来,从beta7开始,TagBuilder发生了重大变化,在公告回购中没有提及它们。
具体来说.ToString不再呈现tagbuilder,它只返回类型的名称。 以前我们可以在HtmlHelper扩展中做这样的事情来构建嵌套的html元素:
var li = new TagBuilder("li"); li.AddCssClass("inactive"); var span = new TagBuilder("span"); span.SetInnerText(somestring); li.InnerHtml = span.ToString();
.InnerHtml现在不再接受字符串,因为它现在是IHtmlContent
但由于.ToString()不呈现标记,因此它不起作用:
li.InnerHtml = new HtmlString(span.ToString())
它只是呈现为“Microsoft.AspNet.Mvc.Rendering.TagBuilder”,类型的名称。
我没有在TagBuilder上看到任何新方法来提供所需的function。 我错过了什么? 如何使用TagBuilder构建复杂的嵌套html?
因为TagBuilder
现在实现了IHtmlContent
,所以你应该能够直接使用它,而无需执行.ToString()
。
var li = new TagBuilder("li"); li.AddCssClass("inactive"); var span = new TagBuilder("span"); span.SetInnerText(somestring); li.InnerHtml = span;
Beta 7中当前实现的真正问题在于没有简单的方法将两个子标记构建器内容附加到父标记构建器内容。 您可以按照GitHub上的讨论进行操作。
目前的提议是使InnerHtml
不可分配,但支持Append
。 这个目标是在Beta 8中实现。
Beta 7中的解决方法是使用StringWriter
调用parent.WriteTo
将其转换为string
。
使用MVC 6,在撰写本文时, Tagbuiler.InnerHtml
确实没有setter了。 它有一些方法来附加元素。 比如你可以写:
var container = new TagBuilder("div"); var input = new TagBuilder("input"); container.InnerHtml.AppendHtml(input);
Beta 8通过添加Append()
方法来标记帮助程序,从而解决了这个问题。
对于beta 7,解决方案是使用BufferedHtmlContent()
类,但由于无法访问它,我们必须做一些额外的工作。
private class MyBufferedHtmlContent : IHtmlContent { internal List Entries { get; } = new List (); public MyBufferedHtmlContent Append(IHtmlContent htmlContent) { Entries.Add(htmlContent); return this; } public void WriteTo(TextWriter writer, IHtmlEncoder encoder) { foreach (var entry in Entries) { entry.WriteTo(writer, encoder); } } }
用法:
TagBuilder firstChild = new TagBuilder("input"); firstChild.MergeAttribute("type", "hidden"); firstChild.MergeAttribute("name", "Ids"); firstChild.TagRenderMode = TagRenderMode.SelfClosing; TagBuilder secondChild = new TagBuilder("input"); secondChild.MergeAttribute("type", "hidden"); secondChild.MergeAttribute("name", "Ids"); secondChild.TagRenderMode = TagRenderMode.SelfClosing; var innerHtml = new MyBufferedHtmlContent(); innerHtml.Append(firstChild); innerHtml.Append(secondChild); TagBuilder parent = new TagBuilder("div"); parent.InnerHtml = innerHtml;
@Memet Olsen
我的所有自定义TagHelpers都更新了4.6.1(1.0.0-rc2)。 InnerHtml.Append()将不再接受TagBuilder。
相反,应该使用AppendHtml()方法:
var container = new TagBuilder("div"); var input = new TagBuilder("input"); container.InnerHtml.AppendHtml(input);
第二个bug修复[这里]
以@ Mihai的答案为基础,展示StringWriter方法的实际代码:
// Create tag builder var builder = new TagBuilder("img"); //... // Render tag approach also changed in .NetCore builder.TagRenderMode = TagRenderMode.SelfClosing; //Create the StringWriter and make TagBuilder "WriteTo" it var stringWriter = new System.IO.StringWriter(); builder.WriteTo(stringWriter, HtmlEncoder.Default); var tagBuilderIsFinallyAStringNow = stringWriter.ToString();
失去了span.SetInnerText(somestring);
现在可以做到
span.InnerHtml.SetContent(somestring);
使用Microsoft.AspNetCore.Html.HtmlContentBuilderExtensions
。
这是从4.7的AspNetCore 2.0.1的角度出发的。