字段中标记管道的sitecore包装不起作用



我使用的是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, @"enclosingTags*=""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>

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

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,而不是干扰正则表达式。在一个简单的场景中,例如single-line text字段,您可能只需要进行StartsWith()检查就可以了。

您应该考虑将代码移动到renderField管道(更多信息请参阅本博客文章或本博客文章),或者使用FieldRendererEnclosingTag属性。这样,标记将在渲染时添加,而不是出现在内容编辑器中。我之前发布的这个SO答案中有一些代码,你也可以用来传递css类。

相关内容

  • 没有找到相关文章

最新更新