一些建议(不一定针对 OP,但针对其他希望解决问题的人):
- 您没有提供进行实际清理的代码,因此我将说明(希望如此)明显的最佳实践,如果您遵循它,那就太好了。 不要使用正则表达式 (Regex) 来解析 HTML
- 此外,在这种情况下,
Sanitize() 方法应遵循immutability 的模式
- 我建议使用以下库
Gans.XSS.HtmlSanitizer,它是一个活跃的库并定期更新。
问题
Razor 视图引擎不知道如何渲染 MarkupStringSanitized。仅仅因为您输入了相同struct 的净化版本并不意味着它可以呈现它。要让它渲染,你需要把它转换成它知道的东西,MarkupString
当我直接使用您的HtmlSanitizedMarkup 而不做任何修改时会发生以下情况。
@((MarkupStringSanitized)Content)
工作示例 #1
这是一个使用我的 Markdown 的示例 -> Html Playground(经过全面测试和工作):
MarkupStringSanitized.cs
public struct MarkupStringSanitized
{
public MarkupStringSanitized(string value)
{
Value = Sanitize(value);
}
public string Value { get; }
public static explicit operator MarkupStringSanitized(string value) => new MarkupStringSanitized(value);
public static explicit operator MarkupString(MarkupStringSanitized value) => new MarkupString(value.Value);
public override string ToString() => Value ?? string.Empty;
private static string Sanitize(string value) {
var sanitizer = new HtmlSanitizer();
return sanitizer.Sanitize(value);
}
}
MarkupStringSanitizedComponent.razor
@if (Content == null)
{
<span>Loading...</span>
}
else
{
@((MarkupString)(MarkupStringSanitized)Content)
}
@code {
[Parameter] public string Content { get; set; }
}
这种额外的转换虽然是丑陋的 IMO。 (也许比我聪明的人可以清理它?)
工作示例 #2
在这里我尝试使用扩展方法扩展MarkupString。它看起来好一点,但只是一点。
MarkupStringExtensions.cs
public static class MarkupStringExtensions
{
public static MarkupString Sanitize(this MarkupString markupString)
{
return new MarkupString(SanitizeInput(markupString.Value));
}
private static string SanitizeInput(string value)
{
var sanitizer = new HtmlSanitizer();
return sanitizer.Sanitize(value);
}
}
MarkupStringSanitizedComponent.razor
@if (Content == null)
{
<span>Loading...</span>
}
else
{
@(((MarkupString)Content).Sanitize())
}
@code {
[Parameter] public string Content { get; set; }
}