复杂属性和状态管理
复杂属性声明/持久:
所谓复杂属性,即通常不可用CLR的基本数据类型表达的属性。譬如,FontInfo,即代表字体属性,包含Bold 、Name、Size、Color等信息(通常称为子属性)。
对于复杂属性,控件在声明时候,通常采用 属性—子属性 的连字符表示复杂属性的一个子属性。
<sdp:TextBox id=”Textbox1” Font-Name=”Vender” Font-Size=”12pt” runat=”server” />
其中的划线部分即代表了Font属性。
复杂属性的另外一种表达是,将复杂属性嵌套放于控件声明标签之中,乘坐 内部属性持久性(inner property persistence )。如:
<asp:DataGrid runat=”Server”>
<HeaderStyle ForeColor=”Red” />
</asp:DataGrid >
复杂属性序列化/持久化的设计时支持
设计时实现是在控件之外实现的,利用元数据(attribute)来实现。对于连字符实现的子属性,经过设定特定的attribute,即可影响设计器从而实现设计时支持。
DesignerSerializationVisibility 实际上在asp.net中是指DesignerSerializationVisibilityAttribute的属性类,通过元数据中指定,并且设为:
DesignerSerializationVisibility.Content可以让设计器知道,应当将复杂属性的内容进行序列化而不是属性本身
DesignerSerializationVisibility.Hidden 让设计器忽略属性和属性内容
DesignerSerializationVisibility.Visible 让设计器以正常方式序列化
所谓正常方式,就是以字符传、整型如果不属于这些就用字节方式持久化属性(当然对于复杂属性这相当划不来)。
NotifyParentProperty(true) 表示属性浏览器对控件得此复杂属性的修改可以通告给控件,并告知之上的各个对象(通常会给设计器应用程序),告知属性已经“脏”了。这些约定对控件设计者和设计器开发者以及asp.net页面的开发者都很重要。
对于标签嵌套方式的属性持久,应当采用ParseChilren(true)来指定属性的持久,设计器实现嵌套方式则应当指定PersistChildren(false)