4

我们有一个复合 CT,它输出其中一个组件的代码字段。

CT的织梦部分如下:

<!-- TemplateBeginRepeat name="Component.HTMLCode" -->
    @@Component.HTMLCode@@
<!-- TemplateEndRepeat -->

但是,此 CT 在页面上显示代码字段,而不是转换为 HTML。

例如:如果代码字段的值为 -> <div align="center" id="loginapp"></div> 那么这个相同的值将显示在页面上而不是解析。

在页面源中,我们得到输出为“ < ;div align=" ;center" id=" ;loginapp" ;> ;< ;/div> ;"

我知道如果我们使用 C# 可以解决这个问题。但是有没有什么办法可以使用dreamweaver 来阻止特殊字符的转换呢?

4

4 回答 4

6

您应该使用 dwt 将代码发布到服务器,我的意思是为每个代码创建新的 dwt,然后将代码粘贴到 dwt 中。您可以将此 dwt 与 emply 组件或资源类型组件一起使用。

或者,如果您想使用文本字段,请尝试遵循 tbb 代码。在模板末尾添加此 tbb。

public override void Transform(Engine engine, Package package)
    {


        Regex objExp = new Regex(@"&#\d+;", RegexOptions.IgnoreCase);
        Regex objDecExp = new Regex(@"[^0-9]", RegexOptions.IgnoreCase);

        this.Initialize(engine, package);
        string strPackage = package.GetValue("Output");

        strPackage = unescapeHTML(strPackage);

        strPackage = objExp.Replace(strPackage, delegate (Match match)
        {

            string strInput = match.ToString();
            strInput = objDecExp.Replace(strInput, "");


            int intValue = Convert.ToInt32(strInput);
            char strChar = (char)intValue;

            return strChar.ToString();
        });



        strPackage = strPackage.Trim();

        Item objOutput = package.CreateStringItem(ContentType.Html, strPackage);
        package.PushItem("Output", objOutput);

    }

    private string unescapeHTML(string strInput)
    {
        StringBuilder strOutput = new StringBuilder(strInput);
        strOutput.Replace("&quot;", "&#34;");
        strOutput.Replace("&nbsp;", "&#32;");
        strOutput.Replace("&amp;", "&#38;");
        strOutput.Replace("&apos;", "&#39;");
        strOutput.Replace("&lt;", "&#60;");
        strOutput.Replace("&gt;", "&#62;");
        strOutput.Replace("&iexcl;", "&#161");
        strOutput.Replace("&cent;", "&#162");
        strOutput.Replace("&pound;", "&#163");
        strOutput.Replace("&curren;", "&#164");
        strOutput.Replace("&yen;", "&#165");
        strOutput.Replace("&brvbar;", "&#166");
        strOutput.Replace("&sect;", "&#167");
        strOutput.Replace("&uml;", "&#168");
        strOutput.Replace("&copy;", "&#169");
        strOutput.Replace("&ordf;", "&#170");
        strOutput.Replace("&not;", "&#172");
        strOutput.Replace("&shy;", "&#173");
        strOutput.Replace("&reg;", "&#174");
        strOutput.Replace("&macr;", "&#175");
        strOutput.Replace("&deg;", "&#176");
        return strOutput.ToString();    
    }


}
于 2012-09-11T13:04:09.433 回答
4

如果我没记错的话,这取决于您的字段类型,如果在您的架构中使用普通文本字段,则 HTML 会被转义,如果您使用富文本字段,它将被解析。

一个选项可能是编写一个 Dreamweaver 自定义函数,该函数允许您取消转义字段(将其表示为 HTML 字段而不是文本字段)。正如您提到的,您也可以在 TBB 中执行此操作,但 Dreamweaver 自定义函数可直接从 DWT 模板调用。无论哪种方式,我认为您确实需要自己进行一些编码。

于 2012-09-11T10:14:05.230 回答
2

RenderComponentField 有两个参数:bool htmlEncodeResult 和 bool resolveHtmlAsRTFContent。你在使用这个内置功能吗?

于 2012-09-11T10:59:00.023 回答
1

谢谢你的帮助。在对dreamweaver 代码进行大量试验后,我们决定使用C# TBB 代替,从而解决了这个问题。

将多行字段作为文本字段读取也是我们犯的错误之一。这导致字段值显示在页面上,而不是呈现为背后的代码。

我们终于使用“MultilineTextField”解决了这个问题。

于 2012-09-12T14:44:48.243 回答