1

我试图让 ServiceStack.Razor 和htmltags一起玩得很好。看起来我需要TemplateBase在写出页面时检查 IHtmlString。下面的代码有效(并从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());
    }
4

1 回答 1

0

如果您使用的是 ASP.Net 4,那么您应该可以IHtmlString直接引用:

var hs = @object as IHtmlString;
if (hs != null)
{
    Builder.Append(hs);
}

问题是,如果您使用的是较旧的 ASP.Net但想使用 MVC 2 - 微软想出了一个有点尴尬MvcHtmlString.System.Web.IHtmlString以前的版本System.Web(没有IHtmlString)。

现在 MVC 3 及更高版本需要ASP.Net 4,所以这不再是问题,只需始终使用IHtmlString.

如果您坚持使用 MVC 2 和 .Net 3.5,那么您当前的解决方法是唯一的解决方法。

但是,当您使用 .Net 4 时,您不需要坚持使用 MVC 2 项目 -您应该能够以最少的更改升级到 MVC 3

于 2013-01-15T13:22:44.790 回答