是的; 将以下参数发布到 Foo/Save:
Foo.ashx/Save?ID=X
&Bar_FieldA=BA
&Bar_FieldB=BB
&Crunches_0_FieldC=CC1
&Crunches_0_FieldD=CD1
&Crunches_1_FieldC=CC2
&Crunches_1_FieldD=CD2
QBO 的AbstractObject/Save
方法支持将数据持久化到 QBO3 知道的任何相关表中。这包括:
- 外键(用于带有属性标记的 C#
ForeignKey
属性)
- 子项(用于带有属性标记的 C#
Child
属性)
- 子类(在类中配置
ObjectConfiguration
)
当Foo/Save
被调用时,AbstractObject/SetProperties
将:
检查外键参数
AbstractObject
将遍历每个定义的外键(包括Foo.BarID
),如果{ForeignKey}
存在以(减去 ID)开头的参数,则设置外键对象的属性。如果Foo.BarID
在 Foo.Fields.cs 中按照这些行定义,这将起作用:
[ForeignKey(typeof(my.Namespace.BarObject), "Bar")]
public Int64 BarID {...}
检查子类属性的集合
AbstractObject
将遍历每个配置的子类,如果ChildClass.Name
存在以开头的参数,则创建子对象的集合并在集合上设置属性。为此,您必须:
包括Crunches
作为Foo
in的子类Foo.config
:
<ChildClasses>
<Child Name="Crunches" Type="my.Namespace.CrunchObject, my.Namespace"/>
</ChildClasses>
由于子类暗示 1:many 关系,集合(由 实现AbstractCollection<T>
)期望每个 Crunch 记录共享一个基于 0 的公共前缀。
注意:配置驱动子类的替代方法是创建一个Crunches
使用此模式调用的 C# 属性:
[Child(typeof(CrunchObject)), XmlIgnore]
public CrunchCollection Crunches {...}
其中CrunchCollection
派生自AbstractCollection<CrunchObject>
,添加已知类型:
[KnownType(typeof(CrunchCollection))]
[KnownType(typeof(CrunchObject))]
public class CrunchCollection : AbstractCollection<CrunchObject>
{...}
这允许AbstractObject
通过反射实例化集合,并在编译时知道数据类型。