现在有一Ajax组件:AjaxText.cs
---
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
using System.Collections.Specialized;namespace WebApplication1
{
    public class TextChangedEventArgs:EventArgs
    {
        public TextChangedEventArgs()
        {
            _text = string.Empty;
        }
        public TextChangedEventArgs(string text)
        {
            _text = text;
        }
        private string _text = string.Empty;
        public string Text 
        {
            get { return _text; }
            set { Text = value; }
        }
    }
    [DefaultEvent("TextChanged")]
    [ToolboxData("<{0}:AjaxText runat=server></{0}:AjaxText>")]
    public class AjaxText:WebControl,ICallbackEventHandler
    {
        private string returnString = string.Empty;
        public delegate void TextChangedEventHandler(object sender, TextChangedEventArgs e);
        private static readonly object eventTextChanged;
        public event TextChangedEventHandler TextChanged
        {
            add
            {
                Events.AddHandler(eventTextChanged,value);
            }
            remove
            {
                Events.RemoveHandler(eventTextChanged, value);
            }
        }
        static AjaxText() 
        {
            eventTextChanged = new object();
        }
        [Description("得到或设置一个Text值")]
        public string Text
        {
            get { object o = ViewState["Text"]; return o==null?"":(string)o; }
            set { ViewState["Text"] = value; }
        }
        private string ReturnString 
        {
            get { return (string)ViewState["ReturnString"]; }
            set { ViewState["ReturnString"] = value; }
        }
        public bool IsValid 
        {
            get 
            {
                object o = ViewState["IsValid"];
                return o == null ? false : (bool)o;
            }
            set 
            {
                ViewState["IsValid"] = value;
            }
        }
        public string ClientCallBackScript 
        {
            get 
            {
                object o = ViewState["ClientCallBackScript"];
                return o == null ? "null" : o.ToString();
            }
            set 
            {
                ViewState["ClientCallBackScript"] = value;
            }
        }
        public string GetCallbackResult()
        {
            return ReturnString;
        }
        public AjaxText() 
        { }
        protected override void Render(HtmlTextWriter writer)
        {
            if (base.Page == null)
            {
                base.Page.VerifyRenderingInServerForm(this);
            }
            string callbackScript = Page.ClientScript.GetCallbackEventReference(this, "this.value", ClientCallBackScript, null);
            writer.AddAttribute("onblur", callbackScript);
            writer.Write("<INPUT type=\"text\" name=\"" + this.UniqueID + "\"onblur=\"" + callbackScript);
            writer.Write("\" value=\"" + this.Text + "\"/>");
            base.Render(writer);
        }
        public void RaiseCallbackEvent(string eventArgument)
        {
            TextChangedEventArgs args = new TextChangedEventArgs(eventArgument);
            OnTextChanged(this, args);
            ReturnString = Convert.ToString(IsValid);
        }
        protected virtual void OnTextChanged(object sender, TextChangedEventArgs e)
        {
            TextChangedEventHandler handler = Events[eventTextChanged] as TextChangedEventHandler;
            if (handler != null)
            {
                Text = e.Text;
                handler(this, e);
            }
        }
    }
}
---页面调用此组件进行用户名检查Default前台
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %><%@ Register assembly="WebApplication1" namespace="WebApplication1" tagprefix="cc1" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <style type="text/css">
        .style1 {
            width: 280px;
        }
    </style>
    <script type="text/javascript" language="javascript">
        function GetCallbackData(res) {
            if (res == 'True') {
                document.getElementById("Label1").innerHTML = "<font color='blue'>you can go ahead~</font>";
                document.getElementById('hi').value = '1';
            }
            else {
                document.getElementById("Label1").innerHTML = "<font color='blue'>I'm sorry , you name has existed in my system~</font>";
                document.getElementById('hi').value = '0';
              }
         
         }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <table>
    <tr><td colspan=2 style="background:Darkgreen">Ajax控件注册实例<input type="hidden"  id="hi" runat="server"/></td></tr>
    <tr><td>用户名:</td><td class="style1">
        <cc1:AjaxText ID="AjaxText1"  ClientCallBackScript="GetCallbackData"  EnableViewState="True"  OnTextChanged="AjaxText1_TextChanged" runat="server" />
        <asp:label runat="server" ID="Label1" ></asp:label><br />
        </td></tr>
           <tr><td>密码:</td><td class="style1"><asp:TextBox runat="server" ID="txtpwd"></asp:TextBox></td></tr>
           <tr><td></td><td><asp:Button ID="Button1" runat="server" Text="  注册" 
                   OnClick="Button1_Click" Width="69px" /></td></tr>
                   <tr><td colspan=2><asp:label runat="server" ID="Label2" ></asp:label></td></tr>
    </table>
    </div>
    </form>
</body>
</html>--Default后台
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           ViewState["valid"] = Request["hi"];
        }        protected void Button1_Click(object sender, EventArgs e)
        {
            string s = (string)ViewState["valid"];
            if (s == "0")
            {
                Response.Write(" 不能进行提交,因为未通过验证\r\nName:" +AjaxText1.Text);
            }
            else
            {
                Response.Write("可以正常注册了,我们就可以进行数据库操作了\r\nName:" + AjaxText1.Text);
            }        }
        protected void AjaxText1_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (e.Text == "aa")
            {                this.AjaxText1.IsValid = false;
            }
            else
            {                this.AjaxText1.IsValid = true;
            }
        }
    }
}
此时有一个问题,可以不刷新检查检查用户名是否存在,但是当我点击注册的时候,
AjaxText的所有状态都回到了初始化状态,比如Text,请问怎么保存我的属性等状态 呢"?