2015-11-12 14 views
9

Tôi đang sử dụng ASP.NET 5. Tôi cần phải chuyển đổi IHtmlContent để StringChuyển đổi IHtmlContent/TagBuilder chuỗi trong C#

IIHtmlContent là một phần của không gian tên ASP.NET 5Microsoft.AspNet.Html.Abstractions và là một giao diện mà TagBuilder thực hiện

Giản tôi có phương pháp sau đây

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

Khi tôi tham khảo nó

string output = GetContent().ToString(); 

tôi nhận được đầu ra sau cho GetContent()

"Microsoft.AspNet.Mvc.Rendering.TagBuilder" 

và không

<tag>blah</tag> 

mà tôi muốn

Tôi cũng đã cố gắng sử dụng StringBuilder

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

nhưng nó cũng nối thêm cùng một không gian tên chứ không phải chuỗi giá trị

Tôi cố gắng để bỏ nó vào TagBuilder

TagBuilder content = (TagBuilder)GetContent(); 

nhưng TagBuilder không có một phương pháp có thể chuyển đổi thành chuỗi

Làm thế nào để chuyển đổi IHtmlContent hoặc TagBuilder thành một chuỗi?

+0

Còn về 'ToHtmlString' thì sao? Ngoài ra, bạn nhận được 'IHtmlContent' từ đâu? –

+1

Tôi đã đề cập đến phương thức 'lớp HtmlString'. Bạn có thể chỉ cho tôi tài liệu cho 'IHtmlContent' không? Nó không có vẻ là trên MSDN –

Trả lời

12

Nếu tất cả các bạn cần làm là đầu ra các nội dung như là một chuỗi, chỉ cần thêm phương pháp này và vượt qua đối tượng IHtmlContent của bạn như một tham số để có được đầu ra chuỗi:

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

Bạn có thể muốn xem xét lại lý do tại sao bạn đang sử dụng phương pháp này vì TagBuilder cho phép chỉ về bất kỳ loại HTML tùy chỉnh nào mà bạn có thể nghĩ đến. Xuất văn bản bằng tay có lẽ không cần thiết.

+0

Câu trả lời hay .. Đây là những gì tôi đang tìm kiếm. – d234

+4

Không hoạt động trên lõi asp.vnext. thay vào đó hãy sử dụng 'HtmlEncoder.Default' – NucS

12

Thêm vào câu trả lời ở trên:

Các trường hợp mới của HtmlEncoder không hoạt động trong ASP.NET Lõi RTM là namespace Microsoft.Extensions.WebEncoders đã được gỡ bỏ và lớp mới HtmlEncoder được chuyển đến một không gian tên mới System.Text.Encodings.Web, nhưng lớp này bây giờ được viết như là một lớp trừu tượng và niêm phong, do đó bạn không thể tạo một thể hiện mới hoặc một lớp dẫn xuất từ ​​nó.

đèo HtmlEncoder.Default để phương pháp này và nó sẽ làm việc

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

ASP.NET cốt lõi thực sự giới thiệu số ít các tối ưu hóa cẩn thận. Nếu bạn đang xây dựng một phương pháp mở rộng HTML, sau đó là cách hiệu quả nhất là để tránh chuỗi:

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

Cuối cùng trong giao diện dao cạo, chúng tôi thậm chí không cần @Html.Raw(Html.GetContent()) nữa (mà sử dụng để được yêu cầu trong ASP.NET MVC 5), chỉ cần gọi @Html.GetContent() là đủ và Razor sẽ chăm sóc tất cả các doanh nghiệp thoát.

Các vấn đề liên quan