【问题标题】:Why can't my Sitecore custom validator read the item as it has been edited in Content Editor?为什么我的 Sitecore 自定义验证器无法读取已在内容编辑器中编辑的项目?
【发布时间】:2016-07-08 00:07:00
【问题描述】:

我在 Sitecore 中创建了一个自定义验证器。它可以正确执行,我可以对其进行调试和单步调试。

我从StandardValidator 扩展了我的验证器,而它又从BaseValidator 扩展。

在我的验证器中,我得到了这个项目:

var item = GetItem();

GetItem 是来自BaseValidator 的方法。根据我的阅读,这是获得要验证的项目的标准方法。

问题:我返回的项目没有反映在内容编辑器中编辑的值。相反,它似乎只是数据库中的项目(因此,它在内容编辑器中首次加载时的样子,没有反映可能对其进行的任何更改)。

因此,我无法验证。要验证编辑器可能在内容编辑器中更改的数据,我需要能够看到这些更改。现在查看该项目在数据库中的位置对我没有帮助。

我做了一些扩展调试,可能有用也可能没用 --

我反编译了内核,遍历了StandardValidatorBaseValidator

来自BaseValidatorGetItem 方法做了我怀疑的事情——它从数据库中获取项目。但随后它通过一个名为UpdateItem 的方法运行它,该方法似乎旨在将来自内容编辑器的输入值覆盖在存储值之上(从而返回一个准确反映当前位于编辑器中的数据的对象)。这显然是我想要的。

但是,UpdateItem 仅在名为 ControlToValidate 的属性具有值时才会显示覆盖任何内容......但它永远不会覆盖。我已经尝试将此验证器作为字段验证器和项目验证器。我通过保存一个项目和一个字段来启动它。我在 Visual Studio 中设置了一个断点,并在 ControlToValidate 上进行了监视。有一次(莫名其妙地)它的值是 FIELD165901047(对应于内容编辑器中的字段 ID),但在所有其他情况下,它都是 null

这意味着UpdateItem 实际上什么都不做,并且该项目只是返回,因为它当前位于数据库中,这没有帮助 - 我正在尝试验证在内容编辑器中输入的值 在保存到数据库之前

不管我的调查如何(我想我理解UpdateItem,但我承认我可能会误解它,并且我没有考虑潜在的反编译错误),我仍然有这个基本问题:

var item = GetItem();

这似乎永远不会从内容编辑器返回值。它直接从数据库返回项目,这对我没有帮助。

【问题讨论】:

  • 你试过类似blog.building-blocks.com/technical-tips/…的东西吗?
  • 你在哪里分配了验证器?到字段还是模板?
  • @SitecoreClimber 我都试过了。对于模板,我将其分配给模板的标准值。
  • 你解决过这个问题吗?我也面临同样的问题。
  • 不。这仍然是一个谜。

标签: validation sitecore custom-validators content-editor


【解决方案1】:

我设法为此创建了一个解决方法,它似乎对我有用。我不高兴我不知道为什么controlToValidate 从来没有值,但我的解决方法设法获得尚未保存的新值。

基本上,我已经覆盖了运行GetItem() 的代码,并且我在页面的SaveArgs 中找到了新值,如下所示。魔术发生在以下行: field.Value = ((((SaveArgs) ((ClientPage) page)?.CurrentPipelineArgs)?.Items[0].Fields) ?? Array.Empty<SaveArgs.SaveField>()).FirstOrDefault(x => x.ID == field.ID)?.Value ?? field.Value;

protected override Item GetItem()
    {
        var obj = base.GetItem();
        if (obj == null || obj.Versions.Count == 0)
            return null;
        UpdateItem(obj);
        return obj;
    }

    private void UpdateItem(Item item)
    {
        Assert.ArgumentNotNull(item, nameof(item));
        using (new SecurityDisabler())
            item.Editing.BeginEdit();
        var page = (Page)null;
        var current = HttpContext.Current;
        if (current != null)
            page = current.Handler as Page;
        foreach (Field field in item.Fields)
        {
            var controlToValidate = ControlToValidate;
            if (string.IsNullOrEmpty(controlToValidate) || field.ID != FieldID)
            {
                field.Value = ((((SaveArgs) ((ClientPage) page)?
                        .CurrentPipelineArgs)?.Items[0].Fields) ?? Array.Empty<SaveArgs.SaveField>()).FirstOrDefault(x => x.ID == field.ID)
                    ?.Value ?? field.Value;
            }
            else
            {
                var str = current != null ? RuntimeValidationValues.Current[controlToValidate] : null;
                if (page != null && str != null)
                {
                    var control = page.FindControl(controlToValidate);
                    if (control != null)
                    {
                        if (control is IContentField contentField)
                            str = contentField.GetValue();
                        else if (ReflectionUtil.GetAttribute(control, typeof(ValidationPropertyAttribute)) is ValidationPropertyAttribute attribute)
                            str = ReflectionUtil.GetProperty(control, attribute.Name) as string;
                    }
                }
                if (str == null && current != null)
                    str = current.Request.Form[controlToValidate];
                if (str != null && str != "__#!$No value$!#__")
                    field.Value = str;
            }
        }
    }

【讨论】:

    【解决方案2】:

    在我使用过的验证器(字段类型验证器)中

     var field = this.GetField();
    

    获取要验证的字段的新值。这同样适用于字段验证器。项目验证器可能有点不同,但我从未编写过项目验证器。

    它也是BaseValidator 的一个方法,返回一个Field 类型的值。您可以将其直接分配给您想要的目标字段的类型,例如HtmlField(Sitecore 已经实现了强制转换运算符,因此您可以这样做):

    HtmlField htmlField = field;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多