Sitecore富文本验证

Sna*_*per 1 validation sitecore rich-text-editor

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

小智 6

富文本字段可以包含各种空标记,例如默认情况下,Sitecore将使用空p标记替换换行符.请参阅HtmlEditor.LineBreakWeb.config中的设置:

  <!--  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" />
Run Code Online (Sandbox Code Playgroud)

或者只输入空格会将字段值保存为 <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));
}
Run Code Online (Sandbox Code Playgroud)

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

第二种方法是创建自定义验证规则.要完成此操作,您需要创建字段规则,自定义验证程序类以及将验证规则与任何富文本字段相关联.以下是步骤:

  1. 打开内容编辑器并导航到sitecore/System/Settings/ValidationRules/Field Rules/Text并添加名为"No Rich For Rich Text"的"验证规则"

  2. 填写标题,描述和类型 在此输入图像描述

  3. RichTextValidator在Validators文件夹下的Web项目下创建类

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."; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在数据模板字段中,添加验证规则

在此输入图像描述 在此输入图像描述

最后,富文本字段应该指示一个严重错误,当只有空标签或 <p>&nbsp;</p>

在此输入图像描述