C# 如何将参数传递给Sitecore中的自定义验证器

C# 如何将参数传递给Sitecore中的自定义验证器,c#,asp.net,sitecore,sitecore8,C#,Asp.net,Sitecore,Sitecore8,我有一个自定义验证器类来验证常规链接字段类型。它检查说明字段的字段值是否不超过15个字符。 但如果同一个或另一个模板的链接字段需要20个字符怎么办 有没有办法,我可以把整数作为参数传递。如果是,如何传递和使用它。 此外,还可以在基本模板的字段级别执行。(以便我可以为每个此类字段定义限制) 命名空间自定义验证器 { //此验证器确保链接的description属性为空或长度为15个字符。 [可序列化] 公共类LinkTextValidator:StandardValidator { 公共重写字符串

我有一个自定义验证器类来验证
常规链接
字段类型。它检查
说明
字段的字段值是否不超过15个字符。
但如果同一个或另一个模板的链接字段需要20个字符怎么办

有没有办法,我可以把整数作为参数传递。如果是,如何传递和使用它。
此外,还可以在基本模板的字段级别执行。(以便我可以为每个此类字段定义限制)

命名空间自定义验证器
{
//此验证器确保链接的description属性为空或长度为15个字符。
[可序列化]
公共类LinkTextValidator:StandardValidator
{
公共重写字符串名称{get{return“Link text validator”;}
公共LinkTextValidator(){}
publicLinkTextValidator(SerializationInfo,StreamingContext上下文):基(info,context){}
受保护的重写验证器结果求值()
{
Field=this.GetField();
如果(字段==null)
返回验证结果。有效;
string fieldValue=this.ControlValidationValue;
if(string.IsNullOrEmpty(fieldValue)| | string.Compare(fieldValue,“”,StringComparison.InvariantCulture)==0)
返回验证结果。有效;
XmlValue XmlValue=新的XmlValue(字段值,“链接”);
字符串属性=xmlValue.GetAttribute(“文本”);
如果(!string.IsNullOrEmpty(xmlValue.GetAttribute(“文本”)&&Convert.ToString(xmlValue.GetAttribute(“文本”)).Length>15)
{
this.Text=this.GetText(“在链接字段\“{0}\”、字段.DisplayName中,描述字段应不超过15个字符);
返回此.GetFailedResult(ValidatorResult.FatalError);
}
其他的
{
返回验证结果。有效;
}
}
受保护的重写ValidatorResult GetMaxValidatorResult()
{
返回此.GetFailedResult(ValidatorResult.FatalError);
}
}
}

看看如何使用regex验证器验证电子邮件:

您可以添加参数,稍后在验证程序代码中读取这些参数:

受保护的覆盖验证器结果求值()
{
字符串controlValidationValue=this.controlValidationValue;
if(string.IsNullOrEmpty(controlValidationValue))
返回验证结果。有效;
字符串模式=this.Parameters[“pattern”];
if(string.IsNullOrEmpty(pattern)| | new Regex(pattern,RegexOptions.IgnoreCase).IsMatch(controlValidationValue))
返回验证结果。有效;
this.Text=this.GetText(“字段\“{0}\”与正则表达式\“{1}\”、this.GetFieldDisplayName()、模式不匹配);
返回此.GetFailedResult(ValidatorResult.Error);
}

看看如何使用regex验证器验证电子邮件:

您可以添加参数,稍后在验证程序代码中读取这些参数:

受保护的覆盖验证器结果求值()
{
字符串controlValidationValue=this.controlValidationValue;
if(string.IsNullOrEmpty(controlValidationValue))
返回验证结果。有效;
字符串模式=this.Parameters[“pattern”];
if(string.IsNullOrEmpty(pattern)| | new Regex(pattern,RegexOptions.IgnoreCase).IsMatch(controlValidationValue))
返回验证结果。有效;
this.Text=this.GetText(“字段\“{0}\”与正则表达式\“{1}\”、this.GetFieldDisplayName()、模式不匹配);
返回此.GetFailedResult(ValidatorResult.Error);
}

请检查下一个类:是否按模板验证字段的maxlength 此规则被指定给一个字段

[Serializable]
public class MaxLengthFieldbyTemplateValidator : StandardValidator
{
    /// <summary>
    /// The template separator in Parameters field
    /// </summary>
    private const char FieldLengthSeparator = '=';

    /// <summary>
    /// The template length separator in Parameters field 
    /// </summary>
    private const char TemplateLengthSeparator = '~';

    /// <summary>
    /// Gets the name.
    /// 
    /// </summary>
    /// 
    /// <value>
    /// The validator name.
    /// </value>
    public override string Name
    {
        get
        {
            return "Max Length";
        }
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="T:Sitecore.Data.Validators.FieldValidators.MaxLengthFieldValidator"/> class.
    /// 
    /// </summary>
    public MaxLengthFieldbyTemplateValidator()
    {
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="T:Sitecore.Data.Validators.FieldValidators.MaxLengthFieldValidator"/> class.
    /// 
    /// </summary>
    /// <param name="info">The serialization info.
    ///             </param><param name="context">The context.
    ///             </param>
    public MaxLengthFieldbyTemplateValidator(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }

    /// <summary>
    /// When overridden in a derived class, this method contains the code to determine whether the value in the input control is valid.
    /// 
    /// </summary>
    /// 
    /// <returns>
    /// The result of the evaluation.
    /// 
    /// </returns>
    protected override ValidatorResult Evaluate()
    {
      return  IsValid(GetItem().TemplateID.ToString()) ? ValidatorResult.Valid : this.GetFailedResult(ValidatorResult.CriticalError);
    }

    private bool IsValid(string currentItemTemplateId)
    {
        var validatorParameters = Parameters;
        // parsing all validators,they are splited by & char 
        foreach (var currentParam in validatorParameters)
        {
            //checking if current item template id is in parameters value
            if (currentParam.Value.Contains(currentItemTemplateId))
            {
                if (currentParam.Value.Contains(TemplateLengthSeparator))
                {
                    var maxLenghKeyValuePair = currentParam.Value.Split(TemplateLengthSeparator)[1];
                    if (maxLenghKeyValuePair.Contains(FieldLengthSeparator))
                    {
                        var maxLengthValue = maxLenghKeyValuePair.Split(FieldLengthSeparator)[1];
                        int intMaxLengthValue = MainUtil.GetInt(maxLengthValue, 0);
                        string controlValidationValue = this.ControlValidationValue;
                        if (string.IsNullOrEmpty(controlValidationValue) ||
                            controlValidationValue.Length <= intMaxLengthValue)
                        { return true; }
                        else
                        {
                            Text = GetText("The maximum length of the field \"{0}\" is {1} characters.", this.GetFieldDisplayName(), maxLengthValue);
                            return false;
                        }
                    }
                }
            }
        }
        return true;
    }

    /// <summary>
    /// Gets the max validator result.
    /// 
    /// </summary>
    /// 
    /// <remarks>
    /// This is used when saving and the validator uses a thread. If the Max Validator Result
    ///             is Error or below, the validator does not have to be evaluated before saving.
    ///             If the Max Validator Result is CriticalError or FatalError, the validator must have
    ///             been evaluated before saving.
    /// 
    /// </remarks>
    /// 
    /// <returns>
    /// The max validator result.
    /// 
    /// </returns>
    protected override ValidatorResult GetMaxValidatorResult()
    {
        return this.GetFailedResult(ValidatorResult.CriticalError);
    }

}
[可序列化]
公共类MaxLengthFieldbyTemplateValidator:StandardValidator
{
/// 
///参数字段中的模板分隔符
/// 
private const char FieldLengthSeparator='=';
/// 
///参数字段中的模板长度分隔符
/// 
private const char TemplateLengthSeparator='~';
/// 
///获取名称。
/// 
/// 
/// 
/// 
///验证程序名称。
/// 
公共重写字符串名
{
得到
{
返回“最大长度”;
}
}
/// 
///初始化类的新实例。
/// 
/// 
公共MaxLengthFieldbyTemplateValidator()
{
}
/// 
///初始化类的新实例。
/// 
/// 
///序列化信息。
///上下文。
///             
公共MaxLengthFieldbyTemplateValidator(SerializationInfo,StreamingContext上下文)
:base(信息、上下文)
{
}
/// 
///在派生类中重写时,此方法包含用于确定输入控件中的值是否有效的代码。
/// 
/// 
/// 
/// 
///评估的结果。
/// 
/// 
受保护的重写验证器结果求值()
{
返回IsValid(GetItem().TemplateID.ToString())?ValidatorResult.Validate:this.GetFailedResult(ValidatorResult.CriticalError);
}
私有布尔值有效(字符串currentItemTemplateId)
{
var参数=参数;
//在分析所有验证器时,它们被&char拆分
foreach(validatorParameters中的var currentParam)
{
//检查当前项目模板id是否在参数值中
if(currentParam.Value.Contains(currentItemTemplateId))
{
if(currentParam.Value.Contains(TemplateLengthSeparator))
{
var maxLenghKeyValuePair=currentParam.Value.Split(TemplateLengthSeparator)[1];
if(MaxLengKeyValuePair.Contains(FieldLengthSeparator))
{
var maxLengthValue=maxLenghKeyValuePair.Split(FieldLengthSeparator)[1];
int intMaxLengthValue=MainUtil.GetInt(maxLengthValue,0);
字符串controlValidationValue=this.controlValidationValue;