2015-11-12 156 views
9

BenBen ASP.NET 5. kullanıyorum

IIHtmlContentASP.NET 5Microsoft.AspNet.Html.Abstractions ad alanının parçası olan String IHtmlContent dönüştürmek için gereken C# dizesine IHtmlContent/TagBuilder dönüştürme ve TagBuilder

Basitleştirilmiş uygulayan bir arayüz ı o

string output = GetContent().ToString(); 
referans zaman aşağıdaki yöntemi

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

sahip

Ben getContent() için aşağıdaki çıktıyı almak

"Microsoft.AspNet.Mvc.Rendering.TagBuilder" 

değil ben

Ben de StringBuilder

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

aynı zamanda bunu kullanarak çalıştı istiyorum

<tag>blah</tag> 

aynı ad alanını ekler ve dize değeri

ipi

nasıl IHtmlContent veya TagBuilder bir dizeye dönüştürebilirim dönüşen bir yöntemi yoktur TagBuilder

TagBuilder content = (TagBuilder)GetContent(); 

ama TagBuilder için döküm çalıştı? Sen isteyebilirsiniz

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

sana neden gözden geçirmeye: yapmanız gereken tüm çıkış dize olarak içeriğini ise

+0

"ToHtmlString" hakkında ne? Ayrıca, nereden 'IHtmlContent' olsun? –

+1

"HtmlString" sınıfının yöntemine başvuruyordum. Beni 'IHtmlContent' belgesine yönlendirir misin? MSDN –

cevap

12

, sadece dize çıktısını almak için bu yöntemi ekleyin ve bir parametre olarak IHtmlContent nesnesini iletin TagBuilder, aklınıza gelebilecek her tür özel HTML için izin verdiği için bu yaklaşımı yeniden kullanıyorsunuz. Metnin elle çıkması muhtemelen gerekli değildir. Yukarıdaki yanıta ekleme

+0

İyi yanıtında görünmüyor. Bu aradığım şey buydu. – d234

+4

Asp.vnext çekirdeğinde çalışmaz. yerine HtmlEncoder.Default 'kullanın – NucS

12

:

Microsoft.Extensions.WebEncoders ad çıkarılmış ve yeni HtmlEncoder sınıf yeni ad System.Text.Encodings.Web taşınır olarak HtmlEncoder yeni örneği ASP.NET Çekirdek RTM çalışmıyor

ama Bu sınıf artık soyut ve mühürlü bir sınıf olarak yazıldığından, yeni bir örnek veya ondan türetilmiş bir sınıf oluşturamazsınız.

yöntemine Geçiş HtmlEncoder.Default ve dikkatli optimizasyonlardan

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

ASP.NET Çekirdek aslında tanıtıldı avuç çalışacaktır.

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; 
} 

Nihayet jilet görünümünde, hatta artık @Html.Raw(Html.GetContent()) gerekmez (ASP.NET gerektirmekte olduğunu kullandı: bir HTML uzantısı yöntemi bina varsa, o zaman en etkili yolu dize kaçınmaktır MVC 5), sadece @Html.GetContent()'u aramak yeterli ve Razor kaçan tüm işleri halledecek.