sitecore包装标签管道在字段中不起作用

时间:2015-04-13 05:37:17

标签: asp.net sitecore pipeline pipelining page-editor

我正在使用sitecore 7.2&我创建了用于封装单行文本标签的管道,如下所示。

public class SingleLineFieldEnclosingTags
    {
        public void Process(RenderFieldArgs args)
        {
            if (args.FieldTypeKey != "single-line text" && args.FieldTypeKey != "multi-line text")
                return;

            args.Result.FirstPart = Helper.WrapInTags(args);            
        }
    }

public static string WrapInTags(RenderFieldArgs args)
        {
            string keyInParam = args.Parameters.Where(x => x.Key.Contains("enclosingTag")).FirstOrDefault().Key;
            string wrappedText = args.Result.FirstPart;

            if (IsPageEditorMode)
            {
                return wrappedText;
            }

            if (keyInParam != null && keyInParam.Trim().Equals("enclosingTag"))
            {
                if (args.Parameters.ContainsKey(keyInParam))
                {
                    string[] paramTags = args.Parameters[keyInParam].Split('|').Reverse().ToArray();

                    foreach (string tag in paramTags)
                    {
                        wrappedText = string.Concat("<", tag.Trim(), ">", wrappedText, "</", tag.Trim().Split(' ')[0], ">");
                    }

                    if (wrappedText.Contains("enclosingTag"))
                    {                            
                        // remove enclosing tag attribute from tags
                        wrappedText = Regex.Replace(wrappedText, @"enclosingTag\s*=\""\s*?.*\""", string.Empty, RegexOptions.IgnoreCase);
                    }
                    return wrappedText;
                }
            }
            return wrappedText;
        }

它工作正常,但是当我们编辑或保存任何字段然后将其保存为

时会出现问题
<p class="intro">Do you need something specific?</p>

也包括封闭标签。现在处于发布模式,它显示两次,三次,如下所示。

<p class="intro"></p>
<p class="intro"></p>
<p class="intro"></p>
<p class="intro">Do you need something specific?</p>
<p></p>
<p></p>
<p></p>

1 个答案:

答案 0 :(得分:1)

我认为您已将此管道添加到Item:Saved。正如您所发现的那样,发布实际上也会在Web数据库中创建/保存项目,在该服务器上触发相同的事件,因此您看到重复的标记。添加一项检查以确保您使用process方法在主数据库中运行:

public void Process(RenderFieldArgs args)
{
    if (!args.Item.Database.Name.Equals("master", StringComparison.InvariantCultureIgnoreCase))
        return;

    if (args.FieldTypeKey != "single-line text" && args.FieldTypeKey != "multi-line text")
        return;

    args.Result.FirstPart = Helper.WrapInTags(args);            
}

但是,您可能需要检查自己的文字是否已包含在所包含的标记中(也是如此) - 使用HTMLAgilityPackCsQuery代替messing with regular expressions。在一个简单的场景中,例如single-line text字段,您可能只需要通过StartsWith()检查即可。

您应该考虑将代码移至renderField管道(此blog postthis one中的更多信息),或使用EnclosingTag属性{ {1}}。这样,标记在渲染时添加,而不是出现在内容编辑器中。我之前发布的this SO answer中有一些代码可以用来传递css类。