web-dev-qa-db-ja.com

C#でIHtmlContent / TagBuilderを文字列に変換する

ASP.NET 5を使用しています。IHtmlContentを文字列に変換する必要があります

IIHtmlContentASP.NET 5Microsoft.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>

私が欲しいもの

StringBuilderも使用してみました

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

ただし、文字列値ではなく、同じ名前空間が追加されます

TagBuilderにキャストしてみました

TagBuilder content = (TagBuilder)GetContent();

tagBuilderには文字列に変換するメソッドがありません

IHtmlContentまたはTagBuilderを文字列に変換するにはどうすればよいですか?

23
zoaz

コンテンツを文字列として出力するだけの場合は、このメソッドを追加し、IHtmlContentオブジェクトをパラメーターとして渡して文字列出力を取得します。

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

上記の答えに追加:

HtmlEncoderの新しいインスタンスは、ASP.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();
}
25
devfric

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()を呼び出すだけで十分であり、Razorはすべてのエスケープビジネスを処理します。

13
vulcan raven

サンプルがあります: 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();
            }
        }
0
workingbird