我正在使用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>
答案 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);
}
但是,您可能需要检查自己的文字是否已包含在所包含的标记中(也是如此) - 使用HTMLAgilityPack或CsQuery代替messing with regular expressions。在一个简单的场景中,例如single-line text
字段,您可能只需要通过StartsWith()
检查即可。
您应该考虑将代码移至renderField
管道(此blog post或this one中的更多信息),或使用EnclosingTag
属性{ {1}}。这样,标记在渲染时添加,而不是出现在内容编辑器中。我之前发布的this SO answer中有一些代码可以用来传递css类。