我很惊讶,在块“生命周期”内仅调用一次块属性设置器。如果是在内部通话
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";
}
}
结果可预期:
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";
//}
}
这一次的结果也是可以预期的:
3。发布更改以阻止测试2
此结果不是如此令人期望:
测试结论:
问题
想象一下下面的代码说明的情况。
[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()));
}
}
}
}
由于测试中描述的问题,此代码无效。
我在某些方面错了吗?如何以某种好的方式解决此问题?
(我知道解决方案。我只是想知道细节和提示。)
答案 0 :(得分:2)
属性值不会通过模型类的属性保存(请记住:即使删除了内容类型 class ,也可以保存内容从代码)。
之所以在SetDefaultValues
中调用setter的原因是您的代码使用了class属性。
根据您的情况,在保存内容时,连接ContentSaving
事件以更改属性值可能更合适。