1

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());
    }
4

1 に答える 1

0

ASP.Net 4 を使用している場合は、IHtmlString直接参照できるはずです。

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

問題は、古い ASP.Net を使用しているが、MVC 2 を使用したい場合です。Microsoft は、 MVC 2 が実装されているように処理されますが、実際には実装できないクラスである の少し扱いに​​くいクラッジを考え出しました。の以前のバージョン(これには がありませんでした)。MvcHtmlStringSystem.Web.IHtmlStringSystem.WebIHtmlString

現在、MVC 3 以降では ASP.Net 4が必要なため、これはもはや問題ではなく、常にIHtmlString.

MVC 2 と .Net 3.5 に行き詰まっている場合は、現在の回避策が唯一の解決策です。

ただし、.Net 4 を使用しているため、MVC 2 プロジェクトに固執する必要はありません。最小限の変更で MVC 3 にアップグレードできるはずです

于 2013-01-15T13:22:44.790 に答える