Sitecore 富文本验证

Sitecore Rich Text Validation

验证 RTE 字段是否包含任何内容的最佳方法是什么? 我尝试将表达式“^(?!\s*$).+”添加到验证中,但它不起作用。发生这种情况是因为 RTE 添加了一些 html 标签(作者无法看到,除非他们切换到 HTML 视图)并且该字段的值实际上不为空。

例如,富文本字段可以有多种空标签,默认情况下,Sitecore 会将换行符替换为空 p 标签。请参阅 Web.config 中的 HtmlEditor.LineBreak 设置:

  <!--  HTML EDITOR LINE BREAK
        Specifies the tag that the HTML editor inserts on Enter. Values can be
        "br", "div" and "p".
  -->
  <setting name="HtmlEditor.LineBreak" value="p" />

或者只输入空格会将字段值保存为<p>&nbsp;</p>

有两种方法可以考虑。

首先是是否担心内容编辑器向富文本编辑器输入内容的不同场景。内容编辑器可能不会详细担心标记,并可能决定删除它,留下换行符或空格。您可以通过使用 HtmlAgilityPack 检查是否有任何节点具有内部文本来处理字段中的值:

public bool HasContent(string val)
{
    var htmlVal = new HtmlDocument();
    htmlVal.LoadHtml(val);
    if (htmlVal.DocumentNode == null || !htmlVal.DocumentNode.ChildNodes.Any())
        return false;

    return htmlVal.DocumentNode.ChildNodes.Any(x => !string.IsNullOrWhiteSpace(x.InnerText));
}

如果没有任何结果,您将不会将该值呈现给页面,从而消除可能的空 p 标记。

第二种方法是创建自定义验证规则。要完成此操作,您需要创建字段规则、自定义验证器 class 并将验证规则关联到任何富文本字段。以下是步骤:

  1. 打开内容编辑器并导航至 sitecore/System/Settings/ValidationRules/Field Rules/Text 并添加名为 "No Content For Rich Text"

  2. 的 "Validation Rule"
  3. 填写标题、描述和类型

  4. 在Validators文件夹下的Web项目下创建RichTextValidatorclass

RichTextValidator.cs

using HtmlAgilityPack;
using Sitecore.Data.Validators;
using System;
using System.Linq;
using System.Runtime.Serialization;

namespace MyProject.Web.Validators
{
    [Serializable]
    public class RichTextValidator : StandardValidator
    {
        public RichTextValidator() { }

        public RichTextValidator(SerializationInfo info, StreamingContext context) : base(info, context)
        { }

        private bool HasContent(string val)
        {
            var htmlVal = new HtmlDocument();
            htmlVal.LoadHtml(val);
            if (htmlVal.DocumentNode == null || !htmlVal.DocumentNode.ChildNodes.Any())
                return false;

            return htmlVal.DocumentNode.ChildNodes.Any(x => !string.IsNullOrWhiteSpace(x.InnerText) && x.InnerText != "&nbsp;");
        }

        protected override ValidatorResult Evaluate()
        {
            string contextText = this.ControlValidationValue;
            if (!HasContent(contextText))
                return ValidatorResult.CriticalError;

            return ValidatorResult.Valid;
        }

        protected override ValidatorResult GetMaxValidatorResult()
        {
            return GetFailedResult(ValidatorResult.CriticalError);
        }

        public override string Name
        {
            get { return "Rich text contains no content."; }
        }
    }
}
  1. 在数据模板字段上,添加验证规则

最后,当只有空标签或 <p>&nbsp;</p>

时,富文本字段应指示严重错误