2015-11-12 8 views
9

Używam ASP.NET 5. muszę konwertować IHtmlContent StringKonwersja IHtmlContent/TagBuilder ciąg w C#

IIHtmlContent jest częścią przestrzeni nazw ASP.NET 5Microsoft.AspNet.Html.Abstractions i to interfejs TagBuilder realizuje

Uproszczone mam następujący sposób

public static IHtmlContent GetContent() 
{ 
    return new HtmlString("<tag>blah</tag>"); 
} 

Kiedy odwoływać

string output = GetContent().ToString(); 

uzyskać następujące dane wyjściowe dla getContent()

"Microsoft.AspNet.Mvc.Rendering.TagBuilder" 

i nie

<tag>blah</tag> 

który chcę

Próbowałem też za pomocą StringBuilder

StringBuilder html = new StringBuilder(); 
html.Append(GetContent()); 

ale również dołącza tę samą przestrzeń nazw, a nie Wartość ciągu

Próbowałem rzucić go do TagBuilder

TagBuilder content = (TagBuilder)GetContent(); 

ale TagBuilder nie ma sposobu, który konwertuje ciąg

Jak przekonwertować IHtmlContent lub TagBuilder na ciąg?

+0

Co z 'ToHtmlString'? Ponadto skąd otrzymujesz 'IHtmlContent'? –

+1

Miałem na myśli metodę klasy "HtmlString'. Czy możesz wskazać mi dokumentację dla 'IHtmlContent'? Wygląda na to, że nie jest na MSDN –

Odpowiedz

12

Jeśli wszystko, co trzeba zrobić, to wyjście zawartość jako ciąg znaków, wystarczy dodać tę metodę i przekazać swój obiekt IHtmlContent jako parametr, aby uzyskać wyjście wyrażenie:

public static string GetString(IHtmlContent content) 
{ 
    var writer = new System.IO.StringWriter(); 
    content.WriteTo(writer, new HtmlEncoder()); 
    return writer.ToString(); 
} 

może ponownie rozważyć, dlaczego "Przyjmowanie tego podejścia, ponieważ TagBuilder pozwala na prawie każdy rodzaj niestandardowego HTML, jaki możesz wymyślić. Ręczne wysłanie tekstu prawdopodobnie nie jest konieczne.

+0

Dobra odpowiedź. Tego właśnie szukałem. – d234

+4

Nie działa na rdzeniu asp.vnext. zamiast tego użyj 'HtmlEncoder.Default' – NucS

12

Dodawanie do odpowiedzi powyżej:

Nowa instancja HtmlEncoder nie działa w ASP.NET podstawowej RTM jako przestrzeń nazw Microsoft.Extensions.WebEncoders usunięto i nowy HtmlEncoder klasa została przeniesiona do nowej przestrzeni nazw System.Text.Encodings.Web, ale ta klasa jest teraz zapisana jako klasa abstrakcyjna i zapieczętowana, więc nie można z niej utworzyć nowej instancji ani klasy pochodnej.

Przełęcz HtmlEncoder.Default metody i będzie działać

public static string GetString(IHtmlContent content) 
{ 
    var writer = new System.IO.StringWriter(); 
    content.WriteTo(writer, HtmlEncoder.Default); 
    return writer.ToString(); 
} 
7

ASP.NET rdzenia rzeczywiście wprowadzony garść starannej optymalizacji. Jeśli budujesz metodę rozszerzenia HTML, a następnie najbardziej skutecznym sposobem jest unikanie ciąg:

public static IHtmlContent GetContent(this IHtmlHelper helper) 
{ 
    var content = new HtmlContentBuilder() 
        .AppendHtml("<ol class='content-body'><li>") 
        .AppendHtml(helper.ActionLink("Home", "Index", "Home")) 
        .AppendHtml("</li>"); 

    if(SomeCondition()) 
    { 
     content.AppendHtml(@"<div> 
      Note `HtmlContentBuilder.AppendHtml()` is Mutable 
      as well as Fluent/Chainable. 
     </div>"); 
    } 

    return content; 
} 

Wreszcie zdaniem brzytwa, nie trzeba nawet @Html.Raw(Html.GetContent()) już (które były wymagane w ASP.NET MVC 5), wystarczy zadzwonić pod numer @Html.GetContent(), a Razor zajmie się wszystkim uciekającym biznesem.