验证RTE字段是否包含任何内容的最佳方法是什么? 我试图添加表达式" ^(?!\ s * $)。+"验证,但它没有工作。发生这种情况是因为RTE添加了一些html标签(除非他们切换HTML视图,否则作者无法看到)并且该字段的值实际上不为空。
答案 0 :(得分:5)
富文本字段可以包含各种空标记,例如默认情况下,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> </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标记。
第二种方法是创建自定义验证规则。要完成此操作,您需要创建字段规则,自定义验证程序类以及将验证规则与任何富文本字段相关联。以下是步骤:
打开内容编辑器并导航到sitecore / System / Settings / ValidationRules / Field Rules / Text并添加&#34;验证规则&#34;命名为#34;没有富文本内容&#34;
在Validators文件夹
RichTextValidator
类
醇>
<强> 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 != " ");
}
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."; }
}
}
}