ASP.NET 5 MVC 6中的TagBuilder InnerHtml

Joe*_*tte 18 c# asp.net-mvc asp.net-core-mvc asp.net-core

在我看来,从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();
Run Code Online (Sandbox Code Playgroud)

.InnerHtml现在不再接受字符串,因为它现在是IHtmlContent

但由于.ToString()不呈现标记,因此它不起作用:

li.InnerHtml = new HtmlString(span.ToString())
Run Code Online (Sandbox Code Playgroud)

它只是呈现为"Microsoft.AspNet.Mvc.Rendering.TagBuilder",类型的名称.

我没有在TagBuilder上看到任何新方法来提供所需的功能.我错过了什么?我现在如何使用TagBuilder构建复杂的嵌套html?

Mem*_*sen 16

在撰写本文时,使用MVC 6 Tagbuiler.InnerHtml确实没有setter了.它有一些方法来附加元素.比如你可以写:

var container = new TagBuilder("div");
var input = new TagBuilder("input");

container.InnerHtml.AppendHtml(input);
Run Code Online (Sandbox Code Playgroud)


Mih*_*scu 15

因为TagBuilder现在实现了IHtmlContent,你应该能够直接使用它而不用了.ToString().

var li = new TagBuilder("li");
li.AddCssClass("inactive");
var span = new TagBuilder("span");
span.SetInnerText(somestring);
li.InnerHtml = span;
Run Code Online (Sandbox Code Playgroud)

Beta 7中当前实现的真正问题在于没有简单的方法将两个子标记构建器内容附加到父标记生成器内容.您可以按照GitHub上的讨论进行操作.

目前的提议是InnerHtml不可转让,而是支持Append.这个目标是在Beta 8中实现.

Beta 7中的解决方法是parent.WriteTo使用a StringWriter将其转换为a string.

  • MVC 6是与MVC 5和之前完全不同的野兽.向后兼容性从来都不是优先事项.这种差异与WebForms和MVC之间的差异相当(夸大其词 - 我知道).您不会看到许多项目已迁移.MVC 6更适合新项目和完整的返工. (3认同)
  • 我会说真正的问题是在自定义`HtmlHelper`方法中使用`TagBuilder.ToString()`的大量MVC3 +代码现在完全被破坏了.想要从一个类中获取HTML字符串,呃,构建HTML字符串是否是激进的? (2认同)
  • 我很欣赏这一点,但我怀疑这些人中的很多人https://github.com/search?l=csharp&q=TagBuilder+HtmlHelper&type=Code&utf8=✓在他们迁移可重复使用的组件代码时会受到严重的打击而且它会无声地失败在他们.那个'ToString()`实现违反了最小惊喜原则,并且使移植变得更加困难,没有充分的理由(除了"我们认为人们不应该这样做"). (2认同)

goa*_*amn 5

以 @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();
Run Code Online (Sandbox Code Playgroud)


小智 5

失去span.SetInnerText(somestring);了现在可以做

span.InnerHtml.SetContent(somestring);

使用Microsoft.AspNetCore.Html.HtmlContentBuilderExtensions.

这是从带有 AspNetCore 2.0.1 的 4.7 的角度来看的。