Пара предложений (не обязательно для OP, но для всех, кто хочет решить проблему):
- Вы не предоставили код, который выполняет фактическую очистку, поэтому я собираюсь изложить (надеюсь) очевидную лучшую практику и, если вы следуете ей, отлично. Не используйте регулярные выражения (Regex) для разбора HTML
- Кроме того, метод
Sanitize()
должен соответствовать шаблону immutability
в этом случае - I предложил бы следующую библиотеку
Gans.XSS.HtmlSanitizer
, которая является активной библиотекой и регулярно обновляется.
Проблема
Razor View Engine может не знать, как сделать MarkupStringSanitized
. Тот факт, что вы набрали обеззараженную версию того же struct
, не означает, что он может ее отрендерить. Чтобы сделать это для рендеринга, вам нужно привести его к чему-то, что он знает, MarkupString
Вот что происходит, когда я использовал ваш HtmlSanitizedMarkup
напрямую без изменений.
@((MarkupStringSanitized)Content)
Рабочий пример # 1
Вот пример использования моей игровой площадки Markdown -> Html (полностью протестирован и работает):
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; }
}
Это дополнительное преобразование, хотя и является уродливым ИМО. (может, кто-нибудь умнее меня сможет это исправить?)
Рабочий пример # 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; }
}