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

标签 c# razor asp.net-core

我正在开发一个 Html Helper,以创建一个由多个元素组成的控件,并使用 TagBuilder 进行构建。控件本身将使用包含带有所有子元素的 divTagBuilder 进行呈现。

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

我实现了 Render() 方法来创建控件并将其作为字符串返回:

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

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

public static MyCustomControl(this IHtmlHelper html)
{
    return new MyCustomControl();
}

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

@(Html.MyCustomControl()
)

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

<div><!-- all child controls html here --></div>

而不是那里有一个元素。

最佳答案

您需要返回 IHtmlContent 的实例,而不是 string :

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

测试用例:

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

结果将是:

<div data-id="123"></div>

关于c# - ASP.NET Core Html Helper 使用 TagBuilder 渲染原始文本而不是格式化 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52635648/

相关文章:

asp.net-mvc - 如何使用 Html.ActionLink 通过 MVC3 指定准确的 URL

c# - 如何在针对模式验证的 XDocument 中查找无效的 XML 节点(XmlSchemaValidationException.SourceObject 为空)

c# - 私有(private)方法?

c# - 在代码隐藏中获取 JQGrid 的所有行数据?

c# - 如何从一批新插入的数据中获取自动生成的 ID?

c# - 无法在 ASP.NET Core 中使用 webpack 中间件

asp.net-core - 使用 dotnet pack 包含所有依赖项

c# - 如何对可空类型使用 Mock 设置

javascript - 与 .net C# razor 模板进行 react

C# 将类属性名称作为参数传递