第一章 .Net 控件开发(WebForm) 开发简单自定义控件(3) HtmlTextWriter的相关枚举以及状态管理

 1、在第二章的(1)和(2)中我们都是采用字符串值传递给HtmlTextWriter类的Write方法,就会引起问题。比如出错无法捕捉,无法获得VS提供的感知功能等等。HtmlTextWriteTag、HtmlTextWriteAttribute、HtmlTextWriteStyle的枚举能帮助我们解决问题。

2、我们先熟悉下这个三个枚举到底是做什么的:

(1)HtmlTextWriterAttribute: 指定 HTML元素的属性。使用方法HtmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Id, "tt");

(2)HtmlTextWriterStyle:指定HTML元素的样式。使用方法HtmlTextWriter.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");

(3)HtmlTextWriterTag:指定HTML元素。使用方法HtmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Table);要注意的是一个Begin对应一个End HtmlTextWriter.RenderEndTag();

(4)这三个枚举也有顺序的。先写Html元素的样式,再写Html元素的属性,最后写Html元素。

3、我们再次对Render方法进行修改。

/// <summary>
        /// 将服务器控件内容发送到提供的 System.Web.UI.HtmlTextWriter 对象,此对象编写将在客户端呈现的内容
        /// </summary>
        /// <param name="writer">接收服务器控件内容的 System.Web.UI.HtmlTextWriter 对象</param>
        protected override void Render(HtmlTextWriter writer)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Border, "1");
            writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "2");
            writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "3");
            writer.RenderBeginTag(HtmlTextWriterTag.Table);
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.Write(Name);
            writer.RenderEndTag();
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "Txt_Name");
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
            writer.AddAttribute(HtmlTextWriterAttribute.Name, "Txt_Name");
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
            writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "Txt_Show");
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
            writer.AddAttribute(HtmlTextWriterAttribute.Value, ShowName);
            writer.AddAttribute(HtmlTextWriterAttribute.Name, "Txt_Show");
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderEndTag();
            base.Render(writer);
        }

4、我们把控件放到页面上,并在Default.aspx.cs页面上设置控件的Name和ShowName属性值

protected void Page_Load(object sender, EventArgs e)
 {
 if (!IsPostBack)
 {
 TestControl1.Name = "Name";
 TestControl1.ShowName = "Show";
 }
 }

 5、我们第一次请求页面会看到我们设置的值,当点击按钮后值发生了变化,变回了默认值,这是为什么呢?原因是:当ASP.NET处理完成第一次请求时,它释放用于处理请求的类(控件名)的对象。当对象被释放时,其属性将永久消失。当处理第二次时,ASP.NET将创造一个新的对象,并设置成默认值。我们用什么方法解决呢?Control类包括了一个名为ViewState的集合属性。这个集合涉及以各 非常重要的对象,他能够自动存储和加载通过页面回传的内容。我们就重写这两个属性。上章我们把属性申明为Virtual,大家可以继承上章的类,用Override重写。写好后,我们在点击按钮页面上的控件的值就不会发生变化了。

public class TestControl1:TestControl
    {
        public override string Name
        {
            get
            {
                return ViewState["Name"] != null ? (string)ViewState["Name"] : "姓名";
            }
            set
            {
                ViewState["Name"] = value;
            }
        }

        public override string ShowName
        {
            get
            {
                return ViewState["ShowName"] != null ? (string)ViewState["ShowName"] : "显示";
            }
            set
            {
                ViewState["ShowName"] = value;
            }
        }
    }

6、将对象存储到ViewState也存在些问题比如增加页面的大小等问题。所以最好吧重要的保存起来,不重要就不要保存了。


 
 
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTE0NzYwMjQyMGRkvMfdka79n8ovQH1k1svSH++CDE0/Z7F4FAAhd2GxMrE=" />
</div>
代码下载地址: 点击下载
本博客内容有些来源于网络或书籍如果侵害到你的权益,请及时联系我(hch458458@vip.qq.com)
版权归nethch所有,转载请注明出处!


   
   


   
   


   
   


   
   


   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值