tutorial net introducción example asp c# asp.net-mvc asp.net-core asp.net-core-mvc

c# - introducción - TagBuilder InnerHtml en ASP.NET 5 MVC 6



controller asp net core 2 (5)

Como TagBuilder ahora implementa IHtmlContent , debería poder usarlo directamente, sin hacer .ToString() .

var li = new TagBuilder("li"); li.AddCssClass("inactive"); var span = new TagBuilder("span"); span.SetInnerText(somestring); li.InnerHtml = span;

El problema real con la implementación actual en Beta 7 es que no hay una manera fácil de agregar dos contenidos de constructor de etiquetas secundarias a uno principal. Puedes seguir la discusión en GitHub .

La propuesta actual es hacer que InnerHtml no se pueda InnerHtml , sino que sea compatible con Append . Esto está dirigido a ser implementado en Beta 8 .

La solución alternativa en Beta 7 es llamar a parent.WriteTo con un StringWriter para convertirlo en una string .

Me parece que hay grandes cambios en TagBuilder a partir de beta7 sin mencionarlos en el repositorio de anuncios.

Específicamente .ToString ya no renderiza el etiquetador, simplemente devuelve el nombre del tipo. anteriormente podíamos hacer cosas como esta dentro de nuestras extensiones HtmlHelper para crear elementos html anidados:

var li = new TagBuilder("li"); li.AddCssClass("inactive"); var span = new TagBuilder("span"); span.SetInnerText(somestring); li.InnerHtml = span.ToString();

.InnerHtml ahora ya no acepta cadena porque ahora es IHtmlContent

pero como .ToString () no representa la etiqueta, esto tampoco funciona:

li.InnerHtml = new HtmlString(span.ToString())

simplemente representa como "Microsoft.AspNet.Mvc.Rendering.TagBuilder", el nombre del tipo.

No veo ningún método nuevo en TagBuilder para proporcionar la funcionalidad necesaria. ¿Qué me estoy perdiendo? ¿Cómo puedo crear html anidados complejos con TagBuilder ahora?


Beta 8 resolvió este problema al agregar un método Append() para etiquetar helpers.

Para beta 7, la solución sería usar la clase BufferedHtmlContent() , pero como no está accesible, debemos hacer un trabajo adicional.

private class MyBufferedHtmlContent : IHtmlContent { internal List<IHtmlContent> Entries { get; } = new List<IHtmlContent>(); 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); } } }

Uso:

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

Todos mis TagHelpers personalizados se rompieron con una actualización a 4.6.1 (1.0.0-rc2). InnerHtml.Append () ya no aceptará un TagBuilder.

En su lugar, se debe usar el método AppendHtml ():

var container = new TagBuilder("div"); var input = new TagBuilder("input"); container.InnerHtml.AppendHtml(input);

2da corrección de errores [aquí]


Usando MVC 6, al momento de escribir, Tagbuiler.InnerHtml ya no tiene setter. En cambio, tiene algunos métodos para agregar el elemento. Por ejemplo, podrías escribir:

var container = new TagBuilder("div"); var input = new TagBuilder("input"); container.InnerHtml.AppendHtml(input);


Basándose en la respuesta de @ Mihai para mostrar el código real para el enfoque 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();