Episerver –为什么绕过财产设定者?

时间:2019-02-21 09:23:46

标签: episerver

我很惊讶,在块“生命周期”内仅调用一次块属性设置器。如果是在内部通话

SetDefaultValues(ContentType contentType)

我对此进行了一些测试:

1。创建新的区块

[ContentType(DisplayName = "SetterTestsBlock", GUID = "43ca7e93-6982-4b95-b073-c42af6ad2315", Description = "")]
public class SetterTestsBlock : BlockData
{
  public virtual string SomeVirtualStringProperty
  {
    get => this.GetPropertyValue(t => t.SomeVirtualStringProperty);
    set { this.SetPropertyValue(t => t.SomeVirtualStringProperty, "Ahoj1"); }      
  }

  public string SomeStringProperty
  {
    get => this.GetPropertyValue(t => t.SomeStringProperty);
    set { this.SetPropertyValue(t => t.SomeStringProperty, "Ahoj2"); }    
  }

  public override void SetDefaultValues(ContentType contentType)
  {
    SomeVirtualStringProperty = "Čau1";
    SomeStringProperty = "Čau2";
  }
} 

结果可预期:

enter image description here

2。再次创建新块

[ContentType(DisplayName = "SetterTestsBlock", GUID = "43ca7e93-6982-4b95-b073-c42af6ad2315", Description = "")]
public class SetterTestsBlock : BlockData
{
  public virtual string SomeVirtualStringProperty
  {
    get => this.GetPropertyValue(t => t.SomeVirtualStringProperty);
    //set { this.SetPropertyValue(t => t.SomeVirtualStringProperty, "Ahoj1"); }
    //set { }
    set { throw new Exception(); }
  }

  public string SomeStringProperty
  {
    get => this.GetPropertyValue(t => t.SomeStringProperty);
    //set { this.SetPropertyValue(t => t.SomeStringProperty, "Ahoj2"); }
    //set { }
    set { throw new Exception(); }
  }

  //public override void SetDefaultValues(ContentType contentType)
  //{
  //    SomeVirtualStringProperty = "Čau1";
  //    SomeStringProperty = "Čau2";
  //}
} 

这一次的结果也是可以预期的:

enter image description here

3。发布更改以阻止测试2

enter image description here

此结果不是如此令人期望:

enter image description here

测试结论:

  1. 在块的首次创建过程中(仅)通过SetDefaultValues(ContentType contentType)方法调用属性设置器。
  2. 永远不会再调用属性设置器。
  3. 观察到的行为不依赖于属性虚拟性(虚拟修饰符)。

问题

想象一下下面的代码说明的情况。

[ContentType(DisplayName = "RealUsageSimulation", GUID = "12737925-ab51-4f63-9144-cd4632244a1c", Description = "")]
public class RealUsageSimulation : BlockData
{
  public string SomeStrPropWithDependency
  {
    get => this.GetPropertyValue(t => t.SomeStrPropWithDependency);
    set
    {
      this.SetPropertyValue(t => t.SomeStrPropWithDependency, GetDBValue());

      string GetDBValue()
      {  
      return string.Join(
        ",",
        value.Split(new[] { ',', ';', '/'}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()));
      }
    }
  }
}

由于测试中描述的问题,此代码无效。

我在某些方面错了吗?如何以某种好的方式解决此问题?

(我知道解决方案。我只是想知道细节和提示。)

1 个答案:

答案 0 :(得分:2)

例如,通过在编辑模式下编辑内容来保存内容时,

属性值不会通过模型类的属性保存(请记住:即使删除了内容类型 class ,也可以保存内容从代码)。

之所以在SetDefaultValues中调用setter的原因是您的代码使用了class属性。

根据您的情况,在保存内容时,连接ContentSaving事件以更改属性值可能更合适。