programing

IHTmlContent/TagBuilder를 C#의 문자열로 변환

closeapi 2023. 8. 19. 10:20
반응형

IHTmlContent/TagBuilder를 C#의 문자열로 변환

저는 ASP를 사용하고 있습니다.NET 5. IHTML 콘텐츠를 문자열로 변환해야 합니다.

IIHtmlContent의 일부입니다.ASP.NET 5 Microsoft.AspNet.Html.Abstractions네임스페이스 및 인터페이스입니다.TagBuilder도구들

단순화 다음과 같은 방법이 있습니다.

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

내가 그것을 참조할 때.

string output = GetContent().ToString();

GetContent()에 대해 다음과 같은 출력이 표시됩니다.

"Microsoft.AspNet.Mvc.Rendering.TagBuilder" 

그리고 아닌

<tag>blah</tag>

내가 원하는 것

String Builder도 사용해 보았습니다.

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

그러나 문자열 값이 아닌 동일한 네임스페이스도 추가됩니다.

TagBuilder에 캐스팅하려고 했습니다.

TagBuilder content = (TagBuilder)GetContent();

그러나 TagBuilder에는 문자열로 변환하는 메서드가 없습니다.

IHtmlContent 또는 TagBuilder를 문자열로 변환하려면 어떻게 해야 합니까?

내용을 문자열로 출력하기만 하면 되는 경우, 이 메서드를 추가하고 IHtmlContent 개체를 매개 변수로 전달하여 문자열 출력을 가져옵니다.

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

위의 답변에 추가:

의 새 인스턴스HtmlEncoderASP에서 작동하지 않습니다.NET Core RTM을 사용하여Microsoft.Extensions.WebEncoders네임스페이스가 제거되고 새 이름 공간HtmlEncoder클래스가 새 네임스페이스로 이동됨System.Text.Encodings.Web그러나 이 클래스는 이제 추상적이고 봉인된 클래스로 작성되므로 새 인스턴스나 파생 클래스를 만들 수 없습니다.

통과하다HtmlEncoder.Default방법대로 하면 효과가 있을 것입니다.

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

ASP.NET Core는 실제로 소수의 신중한 최적화 기능을 도입했습니다.HTML 확장 방법을 작성하는 경우 가장 효율적인 방법은 문자열을 피하는 것입니다.

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

마지막으로, 우리는 심지어 필요하지도 않습니다.@Html.Raw(Html.GetContent())더 이상(과거에는 ASP에서 필요했습니다).NET MVC 5) 아래의 Lukáš Kmoch 의견에 따라 유효하지 않습니다.ASP.NET MVC 5 has type MvcHtmlString. You don't need to use Html.Raw()

방금 전의 전화@Html.GetContent()충분합니다. 그리고 모든 탈출하는 사업은 레이저가 처리할 것입니다.

ToString()처럼 사용할 수 있는 확장 방법이 있습니다.

    public static string ToHtmlString(this IHtmlContent content)
    {
        if (content is HtmlString htmlString)
        {
            return htmlString.Value;
        }

        using (var writer = new StringWriter())
        {
            content.WriteTo(writer, HtmlEncoder.Default);
            return writer.ToString();
        }
    }

샘플이 있습니다: https://github.com/aspnet/Mvc/blob/release/2.2/test/Microsoft.AspNetCore.Mvc.Views.TestCommon/HtmlContentUtilities.cs

public static string HtmlContentToString(IHtmlContent content, HtmlEncoder encoder = null)
        {
            if (encoder == null)
            {
                encoder = new HtmlTestEncoder();
            }

            using (var writer = new StringWriter())
            {
                content.WriteTo(writer, encoder);
                return writer.ToString();
            }
        }

언급URL : https://stackoverflow.com/questions/33667308/convert-ihtmlcontent-tagbuilder-to-string-in-c-sharp

반응형