我想EscapingFormatProvider
在返回它们之前创建一个自动 HTML 转义格式化字符串,除非格式参数以 ! 开头:
string.Format(new EscapingFormatProvider(), "<div>{0}</div>", "<script src='foo'></script>");
// => <div><script src='foo'></script></div>
string.Format(new EscapingFormatProvider(), "<div>{0:!}</div>", "<script src='foo'></script>");
// => <div><script src='foo'></script></div>
我希望它传递格式参数,而不是 ! 如果有,则使用默认格式化程序。唯一的麻烦是,我不知道如何使用默认格式化程序。我发现的所有示例都没有解决委托给默认格式化程序的问题。
编辑:这就是我想出的:
private class EscapingFormatProvider : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType) { return this; }
private string DefaultFormat(string format, object arg)
{
return string.Format("{0:" + format + "}", arg);
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
return (format.First() == '!')
? HttpUtility.HtmlEncode(DefaultFormat(format.Substring(1), arg))
: DefaultFormat(format, arg);
}
}
这有点间接,但我认为它有效。