浅谈ASP.NET内部机制(七)2011-09-15 博客园 小洋前言:本篇讲解与视图ViewState相关的知识,包括IStateManager,自定义转换器TypeConvert,以及和 视图功能相同的控件状态。可以说本篇是对保存状态有关知识的总结,代码也详细的给出。自从上次写了有关视图的文章后,收到了很多朋友的邮件,很感谢大家的支持:)很多朋友都说要求 说说实践性更强的东西,所以本篇就进一步的来谈谈视图(不仅仅只是视图,而且在ASP.NET中的状态保 存的话题)。首先希望大家对自定义控件有一定的了解。大家可以去参看我的控件开发系列。首先我看从一个简单的控件开发来谈起,我们在ASP.NET有Login的登录控件,我们现在就来自己来实 现一个类似的控件,因为本篇主要讲述与视图有关的话题,所以关于事件冒泡等我们不提及,主要是为了 使得代码简洁,易懂,集中讲述一个问题。实现自定义Login控件有很多的方式,我这里会带着大家一步步的做,首先我们继承WebControl来实现 一个控件,然后我们再改进例子,我们来看看从WebControl继承的Login控件:using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace CustomComponents
{
        /**//// <summary>
        ///MyLogin 的摘要说明
        /// </summary>
        public class MyLogin:WebControl 
        {
                属性#region  属性
                public string UserName
                {
                        get
                        {
                                return ViewState["UserName"] != null ? (string)ViewState["UserName"] : "UserName";
                         }
                        set
                        {
                                ViewState["UserName"] = value;
                        }
                }
                public string UserPassword
                {
                        get
                        {
                                return ViewState ["UserPassword"] != null ? (string)ViewState["UserPassword"] : "UserPassword";
                         }
                        set
                        {
                                ViewState["UserPassword"] = value;
                        }
                }
                #endregion
                protected override HtmlTextWriterTag TagKey
                {
                        get
                        {
                                return HtmlTextWriterTag.Table;
                        }
                }
                protected override void RenderContents(HtmlTextWriter writer)
                {
                        //显示用户名
                        writer.RenderBeginTag (HtmlTextWriterTag.Tr);
                        writer.RenderBeginTag (HtmlTextWriterTag.Td);
                        writer.Write(UserName);
                        writer.RenderEndTag();
                        writer.RenderBeginTag (HtmlTextWriterTag.Td);
                        writer.AddAttribute (HtmlTextWriterAttribute.Id, "txtUserName");
                        writer.AddAttribute (HtmlTextWriterAttribute.Type, "text");
                        writer.RenderBeginTag (HtmlTextWriterTag.Input);
                        writer.RenderEndTag();
                        writer.RenderEndTag();
                        writer.RenderEndTag();
                         //显示用户密码
                        writer.RenderBeginTag (HtmlTextWriterTag.Tr);
                        writer.RenderBeginTag (HtmlTextWriterTag.Td);
                        writer.Write(UserPassword);
                        writer.RenderEndTag();
                        writer.RenderBeginTag (HtmlTextWriterTag.Td);
                        writer.AddAttribute (HtmlTextWriterAttribute.Id, "txtPassword");
                        writer.AddAttribute (HtmlTextWriterAttribute.Type, "text");
                        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, "btnSubmit");
                        writer.AddAttribute (HtmlTextWriterAttribute.Type, "submit");
                        writer.AddAttribute (HtmlTextWriterAttribute.Value, "Login");
                        writer.RenderBeginTag (HtmlTextWriterTag.Input);
                        writer.RenderEndTag();
                        writer.RenderEndTag();
                        writer.RenderEndTag();
                 }
        }
}