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> </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 并将验证规则关联到任何富文本字段。以下是步骤:
打开内容编辑器并导航至 sitecore/System/Settings/ValidationRules/Field Rules/Text 并添加名为 "No Content For Rich Text"
的 "Validation Rule"
在Validators文件夹下的Web项目下创建RichTextValidator
class
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."; }
}
}
}
- 在数据模板字段上,添加验证规则
最后,当只有空标签或 <p> </p>
时,富文本字段应指示严重错误
验证 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> </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 并将验证规则关联到任何富文本字段。以下是步骤:
打开内容编辑器并导航至 sitecore/System/Settings/ValidationRules/Field Rules/Text 并添加名为 "No Content For Rich Text"
的 "Validation Rule"
在Validators文件夹下的Web项目下创建
RichTextValidator
class
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."; }
}
}
}
- 在数据模板字段上,添加验证规则
最后,当只有空标签或 <p> </p>