asp.net控件开发技巧(1)使用HtmlTextWriter类规范输出标签

使用HtmlTextWriter类规范输出标签

1.尽量使用内置的方法输出标签

写过控件的人没有人会说没用过Render和RenderContents方法,其中关键的类就是用HtmlTextWriter类的一些方法把html标签呈现出来,但其写法不同,效果却相同。如输出一个下拉框:

public class DemoControl : Control
  {
    protected override void Render(HtmlTextWriter writer)
    {
      //1.以输出字符串形式输出html
      /**//*
      writer.Write("<select>");
      writer.Write("<option value='0'>asp.net</option>");
      writer.Write("<option value='1'>asp.net ajax</option>");
      writer.Write("</select>");
      */

      //2.用.net内置推荐的方法输出html
      writer.RenderBeginTag(HtmlTextWriterTag.Select);
      writer.AddAttribute(HtmlTextWriterAttribute.Value, "0");
      writer.RenderBeginTag(HtmlTextWriterTag.Option);
      writer.Write("asp.net");
      writer.RenderEndTag();
      writer.AddAttribute(HtmlTextWriterAttribute.Value, "1");
      writer.RenderBeginTag(HtmlTextWriterTag.Option);
      writer.Write("asp.net ajax");
      writer.RenderEndTag();
    }
  }

当你熟悉这些方法后,请尽量使用这些方法

2.分段呈现标签

此方法等于为重构,当标签呈现的比较多,请不要一步到底的写下来,分部把需要的东西写在各个方法里面再组合,

如的示例三,说实话的,虽然用HtmlTextWriter的函数输出标签,但还不如直接输出字符串来的明白,一大堆的RenderBeginTag和RenderEndTag方法。请分段呈现标签,分拆函数。然后以Render开头的函数命名,这样看起来就清晰多了。

protected override void Render(HtmlTextWriter writer)
   {
     RenderTable(writer);
   }

   private void RenderTable(HtmlTextWriter writer)
   {
     writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, "0");
     writer.RenderBeginTag(HtmlTextWriterTag.Table);
     RnderPaymentMethod(writer);
     RenderCreditCardNo(writer);
     RenderCardholderName(writer);
     RenderExpirationDate(writer);
     RenderSubmitButton(writer);
     writer.RenderEndTag();
   }

3.规范标签ID命名

不要把控件的头标签把ID名字定死,防止名字重叠,可以把Control的UniqueID属性赋给ID属性,子标签也一样。可以以父标签的id为前缀,然后再加以命名。另外的好处就是可以跟前端交互,灵活性增强。

//writer.AddAttribute(HtmlTextWriterAttribute.Id, "select1");
      writer.AddAttribute(HtmlTextWriterAttribute.Id, this.UniqueID);
      writer.RenderBeginTag(HtmlTextWriterTag.Select);
      //以父标签的id为前缀
      writer.AddAttribute(HtmlTextWriterAttribute.Id, this.UniqueID+"_asp");
      writer.RenderBeginTag(HtmlTextWriterTag.Option);
      writer.Write("asp.net");
      writer.RenderEndTag();
      writer.RenderEndTag();

4.判断输出动态属性

如TextBox的Text属性,当其属性未设置时,呈现出来的标签value属性不呈现,即后端要判断,不然则要呈现value=""这项工作比较繁琐。

string text = this.Text;
      if (text.Length > 0)
      {
        writer.AddAttribute(HtmlTextWriterAttribute.Value, text);
      }

暂时就这些,想到再补充。不想把别的写进去。以后分开写。大家想到再补充。

时间: 2024-12-24 02:34:46

asp.net控件开发技巧(1)使用HtmlTextWriter类规范输出标签的相关文章

asp.net控件开发技巧(2)关闭基类不必要的功能

1.关闭容器 Control类有Controls集合属性,即继承Control类的控件都是一个容器控件,asp.net控件内置的有PlaceHolder控件,其只继承自Control类,什么也没做.但所有控件都是继承自Control类的.如一个label控件,照样可以当容器使用. label1.Controls.add(control) 有些控件则不需要这个功能,如Literal控件,只输出纯文字,不允许添加子控件 开发技巧(2)关闭基类不必要的功能-"> 很简单,重写CreateCont

一起谈.NET技术,asp.net控件开发基础(15)

继续我们的话题吧.自定义控件.如果你还不熟悉自定义控件开发的话,还请看看我以前写了几篇,希望对你有帮助 1.1何处继承 自定义控件一般从以下几个基类(此处不包含数据控件) 一.Control类(所有服务器控件的基类,算是比较底层的类,如果控件功能比较简单,要求不多,可直接继承此类.) 二.WebControl类(标准控件的基类,继承此类,你可以继承其丰富的公共属性,若标准控件中的控件没有你需要的控件,你可以继承此类) 三.CompositeControl 类(2.0新增的类,此类继承自WebCo

ASP.NET控件开发基础(7)

上一篇写了控件样式的一些基础的东西,接着我们继续讨论asp.net控件开发的一些东西. 这次我们要讨论的是复合控件.本文无法一步到位完整介绍,因为讨论的篇幅比较大,所以分两次写,这次就先讲些基本概念吧,剩着的下次写. 好象复合控件网上已经有很多教程了,相信大家也看过很多.如果看过的朋友就当我再废话一便,没看过的朋友希望能给你带来帮助. 1.复合控件概念 复合控件跟用户控件有很多相似点,最大不同就是用户控件后缀为ascx,而复合控件编译后则为dll文件,还可以分发给大家使用,另外其他不同点还请参考

asp.net控件开发(一) 显示控件内容

asp.net控件的显示自然会离不开输出HTML.CSS.Javascript等前台的显示内容,所以开发一个控件的时候第一件事就是要知道如何输出客户端要显示的内容. 一.选择基类 asp.net中所有的标准控件都可以拿过来作为基类,如果我们要开发的控件只是对原有的标准控件做一些功能上的加强的话(如:你对TreeView的CheckBox添加一些随动的功能),就可以直接拿标准控件过来作为基类. 一般的如果开发的控件从标准里面找不到合适的,可以从三个类中来继承: System.Web.UI.Cont

asp.net控件开发(一) -- 显示控件内容

asp.net控件的显示自然会离不开输出HTML.CSS.Javascript等前台的显示内容,所以开发一个控件的时候第一件事就是要知道如何输出客户端要显示的内容. 一.选择基类 asp.net中所有的标准控件都可以拿过来作为基类,如果我们要开发的控件只是对原有的标准控件做一些功能上的加强的话(如:你对TreeView的CheckBox添加一些随动的功能),就可以直接拿标准控件过来作为基类. 一般的如果开发的控件从标准里面找不到合适的,可以从三个类中来继承: System.Web.UI.Cont

一起谈.NET技术,asp.net控件开发基础(17)

本篇将开始介绍如自定义数据绑定控件,这里感谢很多人的支持,有你们的支持很高兴.这里首先需要大家熟悉asp.net模板控件的使用,还有自定义模板控件.因为数据绑定控件多是基于模板控件的. 一.回顾 如果你使用过asp.net内置的数据控件(如DataList,Repeater),你一定会这么做 1.设置数据源 DataSource属性 2.调用数据绑定  DataBind方法 3.在控件的不同模板内使用绑定语法显示数据 这三步应该是必须要做的 其他更多的 你可能需要对绑定的数据进行统一的一些操作(

一起谈.NET技术,asp.net控件开发基础(13)

1.减轻服务器压力,增加用户体验 服务器功能是强大的,客户端脚本一点也不弱,现在的ajax技术和Atlas技术就是最好的证明,我们总是期待UI有一个好的效果,flash动画给我们带来了很酷的效果,我们至少也可以为我们的服务器控件添加客户端脚本,一方面减少了服务器端的回传,一方面又能为控件提供非常酷的效果.我想我们都很喜欢ATLAS里面很多很酷的控件吧,而且无刷新,服务器控件与客户端脚本交互使用,那会服务器控件变的更加完美. 经过上面的废话,下面我们进入正题 2.简单为服务器控件添加客户端脚本 我

一起谈.NET技术,asp.net控件开发基础(10)

集合属性相信大家都很熟悉也很常用,如DropDownList,ListBox等控件 <asp:DropDownList ID="DropDownList1" runat="server">            <asp:ListItem>测试1</asp:ListItem>            <asp:ListItem>测试2</asp:ListItem>            <asp:Lis

一起谈.NET技术,asp.net控件开发基础(8)

有一些复合控件直接把按钮触发事件所需的事情封装好,另外一种则是自定义事件,更具灵活性,当然这是根据需要设计的.以下会以例子来说明的.下面我们假设我们控件中有两个按钮.以下不列出所有代码,具体可在文章最后下载代码. (1) 直接实现按钮事件 在控件中(以下代码并非实现复合控件)直接实现事件则无需自定义事件,如下代码(如果对数据回传有些不熟悉的话,可先看第三篇,希望对你有帮助) 示例一(只列出局部代码,具体可在文章最后下载代码) void IPostBackEventHandler.RaisePos