当前位置:中国站长下载文章中心网页编程.NET编程 → ASP.NET服务器控件之RenderContents(4)

ASP.NET服务器控件之RenderContents(4)

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-14 8:34:15
     代码说明之3个属性:
  
    在上文代码中主要包括了3个属性:Email、Text和TagKey。Email属性用于获取或者设置具体的电子邮件地址,Text属性用于获取或者设置控件显示的文本内容。在这两个属性实现中,都使用了控件视图状态ViewState。服务器控件的视图状态为其所有属性值的累计。对于简单属性的实现,将经常使用ViewState。TagKey属性是重写属性,其继承自WebControl 基类,这是读者需要理解的重点内容。重写TagKey属性主要是为了呈现HTML标记中的a元素,这样就不会呈现WebControl类所默认呈现的 span元素。此处,也暗示了本控件使用的构造函数是继承自WebControl的protected WebControl (),读者可返回上文再看看有关这个构造函数的说明。需要读者牢记的是:如果要呈现的元素是HtmlTextWriterTag枚举的成员,则应重写 TagKey属性。许多常见的HTML元素标记被映射为HtmlTextWriterTag枚举的值。例如, System.Web.UI.HtmlTextWriterTag.A与a元素对应,而 System.Web.UI.HtmlTextWriterTag.Table与table元素对应。如果要呈现的元素不是由 HtmlTextWriterTag枚举的成员表示,那么建议重写TagName属性,并返回要作为元素呈现的字符串。
  
    代码说明之2个方法:
  
    在RenderContentsControl服务器控件中重写了2个重要方法:一个是AddAttributesToRender、另一个是RenderContents。
  
    (1)AddAttributesToRender
  
    该方法用于为控件添加一个Href属性,并将该属性值设置为"mailto:Email",其中Email是上文所述的表示邮件地址的属性。当重写 AddAttributesToRender方法时,应始终按照控件源代码演示的方式:首先,调用基类方法,然后进行相关设置。这样才能实现为服务器控件添加样式和其他属性的功能。实际上,根据前文所述的RenderBeginTag方法的实现示意性代码可知,AddAttributesToRender 方法是由WebControl的RenderBeginTag方法调用。
  
    (2)RenderContents
  
    该方法是本示例的核心内容,其用于在控件的标记中写入由Text属性指定的超链接文本。如代码所示,服务器控件调用了HtmlTextWriter实例的 WriteEncodedText方法,以对开发人员输入的文本进行HTML编码。一般情况下,为了安全起见,应该对用户提供的文本进行HTML编码。
  
    代码说明之元数据属性标记:
  
    元数据属性标记在类前和属性实现前都有所应用。有关这些元数据属性标记的说明,在以前的文章中已经进行了具体说明。读者可查阅有关讲解如何创建一个简单的服务器控件的文章。下面重点说明一下有关内部文本持久性的问题。
  
    在类前的元数据属性标记中,设置了ParseChildren(true, "Text")。在Text属性前的元数据属性标记中,设置了PersistenceMode (PersistenceMode.InnerDefaultProperty)。通过以上两个设置,则为控件添加了内部文本持久性设置。如此设置,可使得开发人员能够在控件标记代码内设置Text属性。例如:
  
  <Sample:RenderContentsControl runat="server" ID="CustomerControl" Email="my@mysample.com">我的邮箱地址</Sample:RenderContentsControl>
  
    在上面的代码中,原来文本"我的邮箱地址"应由Text属性设置(这就是默认持久性),然而,由于内部文本持久性设置,因此,可以在控件标记内设置控件文本。
  
    实现内部持久性,应使用ParseChildren(true, "Text")来标记RenderContentsControl控件。ParseChildren的第一个参数true,其用于指定页分析器应将控件标记内的内容分析为属性,而不是子控件。第二个参数提供控件的内部默认属性名称为Text。使用这两个参数调用ParseChildren构造函数时,控件标记内的内容必须与内部默认属性对应。Text属性的PersistenceMode (PersistenceMode.InnerDefaultProperty),用于指定可视化设计器应将此属性作为控件标记中的内部内容进行序列化。
  通常,WebControl类使用PersistChildren(false)和ParseChildren(true)控制设计时和分析时属性的持久性。这两个属性将被控件继承,且仅在要更改继承的设置时需要应用。PersistChildren告知设计器是否应将服务器控件的子控件作为嵌套的内部控件保存。false参数指示内部内容与属性对应,而不是与子控件对应。ParseChildren已在上一段中加以说明。如果WebControl类的设计时和分析时持久性适用于您的控件,则不必重写从WebControl继承的PersistChildren和ParseChildren。
  
    下面列举了用于测试服务器控件的Default.ASPx文件源代码  做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。