It seems that you circumvent lots of logic when you change the writer. One alternative is to wrap the original writer and try to catch whatever that's written to it. Not sure about side effects.
Try the class below and assign it to tempWriter variable instead.
var tempWriter = new CustomTextWriter(htmlHelper.ViewContext.Writer);
As next step, fetch the HTML using this code:
using (var writer = new StringWriter())
{
tempWriter.GetHtmlContent().WriteTo(writer, HtmlEncoder.Default);
var contentItemContent = new HtmlString(writer.ToString());
}
public class CustomTextWriter : TextWriter
{
private readonly TextWriter _wrappedWriter;
private readonly StringBuilder _sb;
public CustomTextWriter(TextWriter wrappedWriter)
{
_wrappedWriter = wrappedWriter;
_sb = new StringBuilder();
}
public override Encoding Encoding => _wrappedWriter.Encoding;
public override void Write(char value)
{
_wrappedWriter.Write(value);
_sb.Append(value);
}
public override void Write(object value)
{
_wrappedWriter.Write(value);
}
public override void Flush()
{
_wrappedWriter.Flush();
}
public override Task FlushAsync()
{
return _wrappedWriter.FlushAsync();
}
protected override void Dispose(bool disposing)
{
_wrappedWriter.Dispose();
}
public override ValueTask DisposeAsync()
{
return _wrappedWriter.DisposeAsync();
}
public IHtmlContent GetHtmlContent()
{
return new HelperResult(writer => writer.WriteAsync(_sb));
}
}
In previous CMS 11.x version, I can modify ContentAreaRenderer result with codes bellow without any problems:
After upgrade to CMS 12 versions, the result I get from tempWriter.ToString() always contain TagBuilder type at start and end of result as captured image.
Go inside base.RenderContentAreaItem, i think the problem come from these lines htmlHelper.ViewContext.Writer.Write((object) ...) , i think this need write raw html result.