ASP.NET Core Html Helper 使用 TagBuilder 渲染原始文本而不是格式化 HTML

Val*_*tor 2 c# razor asp.net-core

我正在开发一个 Html Helper 来创建一个由多个元素组成的控件,使用TagBuilders 构建。控件本身将使用TagBuilder包含 adiv和所有子元素的 a 进行渲染。

据此: https: //developercommunity.visualstudio.com/content/problem/17287/tagbuilder-tostring-returns-the-type-of-tagbuilder.html

我实现了一种Render()方法来创建控件并将其返回为string

public class MyCustomControl
{
    public override string ToString()
    {
        return Render();
    }

    private string Render()
    {
        TagBuilder mainContainer = new TagBuilder("div");

        // Generate child elements and append to mainContainer...

        using (StringWriter writer = new StringWriter())
        {
            mainContainer.WriteTo(writer, HtmlEncoder.Default);

            return writer.ToString();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并创建了一个扩展方法来在 Razor 视图中调用它:

public static MyCustomControl(this IHtmlHelper html)
{
    return new MyCustomControl();
}
Run Code Online (Sandbox Code Playgroud)

并将其包含在视图中,如下所示:

@(Html.MyCustomControl()
)
Run Code Online (Sandbox Code Playgroud)

问题是我没有渲染 html,而是将原始 html 文本输出到视图,所以我实际上看到:

<div><!-- all child controls html here --></div>
Run Code Online (Sandbox Code Playgroud)

而不是那里有一个元素。

itm*_*nus 5

您需要返回一个实例IHtmlContent而不是string

public static class HtmlHelperExtension {
    public static IHtmlContent MyCustomControl(this IHtmlHelper html)
    {
        var result = new MyCustomControl();
        return html.Raw(result.Render());
    }
}
Run Code Online (Sandbox Code Playgroud)

测试用例 :

public class MyCustomControl
{
    public override string ToString()
    {
        return Render();
    }

    public string Render()
    {
        TagBuilder mainContainer = new TagBuilder("div");
        mainContainer.Attributes.Add(new KeyValuePair<string, string>("data-id","123") );

        // Generate child elements and append to mainContainer...

        using (StringWriter writer = new StringWriter())
        {
            mainContainer.WriteTo(writer, HtmlEncoder.Default);

            var result=writer.ToString();
            return result;
        }
    }
Run Code Online (Sandbox Code Playgroud)

结果将是:

<div data-id="123"></div>
Run Code Online (Sandbox Code Playgroud)