ServiceStack.Razor とhtmltagsをうまく連携させようとしています。ページを書き出すときに IHtmlString をチェックするには、 TemplateBaseが必要なようです。以下のコードは機能します (そしてMvcHtmlString/DynamicMvcHtmlStringから手がかりを得ます) が、リフレクションがすべての書き込みで発生するため、これは優れたソリューションとは思えません。
何か案は?
/// <summary>
/// Writes the specified object to the template result.
/// </summary>
/// <param name="object">The object to write.</param>
public void Write(object @object)
{
if (@object == null)
return;
if (@object is MvcHtmlString)
{
Builder.Append(@object);
}
else if (typeof (HttpContext).Assembly.GetType("System.Web.IHtmlString") != null && (typeof (HttpContext).Assembly.GetType("System.Web.IHtmlString")).IsInstanceOfType(@object))
{
Builder.Append(@object);
}
else
{
var strValue = Convert.ToString(@object);
Builder.Append(HttpUtility.HtmlEncode(strValue));
}
}
私の現在の回避策は、html を新しい MvcHtmlString でラップすることです
public static MvcHtmlString ToMvcHtmlString(this HtmlTag htmlTag)
{
return MvcHtmlString.Create(htmlTag.ToHtmlString());
}