我正在开发一个 Html Helper,以创建一个由多个元素组成的控件,并使用 TagBuilder
进行构建。控件本身将使用包含带有所有子元素的 div
的 TagBuilder
进行呈现。
我实现了 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/