创建HtmlHelper.Raw标记助手

时间:2017-11-08 02:34:00

标签: c# asp.net

我正在尝试在asp.net核心中实现一个Tag Helper类,它返回其内容的原始输出。

这是我的尝试:

public class RawTagHelper : TagHelper
{
    public RawTagHelper(IHtmlHelper _)
    {
        HtmlHelper = _;
    }

    private IHtmlHelper HtmlHelper { get; }

    [ViewContext]
    public ViewContext ViewContext { get; set; }

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        ((IViewContextAware)HtmlHelper).Contextualize(ViewContext);

        output.TagName = null;
        output.Content.SetHtmlContent(HtmlHelper.Raw(await output.GetChildContentAsync()));
    }
}

问题是HtmlHelper.Raw返回一个对象DefaultTagHelperContent

1 个答案:

答案 0 :(得分:0)

实际上问题是我将await output.GetChildContentAsync()传递给接受字符串的HtmlHelper.Raw,所以我不得不改变

output.Content.SetHtmlContent(HtmlHelper.Raw(await output.GetChildContentAsync()));

output.Content.SetHtmlContent(HtmlHelper.Raw((await output.GetChildContentAsync()).GetContent()));

然后我意识到SetHtmlContent会再次将其编码为html元素,所以我最终得到了元素的内容,并使用SetContent代替SetHtmlContent

所以HtmlHelper.Raw Tag Helper看起来应该是那样的

public class RawTagHelper : TagHelper
{
    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = null;
        output.Content.SetContent((await output.GetChildContentAsync()).GetContent());
    }
}

使用..

<raw>Some text <div>Other text</div></raw>

输出..

Some text <div>Other text</div>