服务器控件如何自动加载回发数据

        以创建一个 TextBox 的服务器控件为例,我们继承 System.Web.UI.WebControls.WebControl,在重载的 Render  方法中编写将在客户端呈现的内容:

protected   override   void  Render(HtmlTextWriter output)
{
         output.WriteLine(
"<input type = /"text/"  value = /"{0}/">",  this.Text);
}

        但这样简单的代码实现的TextBox在页面刷新时无法保存在用户的输入,为了自动加载回发数据,这个控件需要实现IPostBackDataHandler接口(定义 ASP.NET 服务器控件为自动加载回发数据而必须实现的方法)。IPostBackDataHandler接口有两个需要实现的方法:LoadPostDataRaisePostDataChangedEvent 。

        bool LoadPostData (s tring postDataKey, N ameValueCollection postCollection) 为 ASP.NET 服务器控件处理回发数据,postDataKey为控件的主要标识符,即控件的 UniqueID,当页面回发时,如果自定义控件中有name为 UniqueID 的 html 控件,这个方法将会被调用。参数 postCollection 是一个名称值的集合,里面存放的是客户端 Html<input> 元素在回发之前的值,元素的name属性作为Key。因此,在 LoadPostData 方法中我们可以根据控件的name找到回发前的值并加载,从而恢复控件回发前的状态。

        LoadPostData方法的返回值是一个布尔值,如果返回 true 将会调用 RaisePostDataChangedEvent 方法,通知 ASP.NET 应用程序该控件的状态已更改,因此在 RaisePostDataChangedEvent  方法中,我们可以加入处理服务器控件值变化的事件,比如在 TextBox 中就可以定义一个 TextChanged 事件。 

最后,一个 TextBox 控件就可以用如下代码实现:

      public   class  MyTextBox : System.Web.UI.WebControls.WebControl, IPostBackDataHandler
    
{
        
public string Text
        
{
            
get
            
{
                
return (string)this.ViewState["Text"];
            }

            
set
            
{
                
this.ViewState["Text"= value;
            }

        }


        
public event EventHandler TextChanged;

        
public virtual bool LoadPostData(string postDataKey,
           NameValueCollection postCollection)
        
{
            
string presentValue = Text;
            
string postedValue = postCollection[postDataKey];

            
if (presentValue == null || !presentValue.Equals(postedValue))
            
{
                
this.Text = postedValue;
                
return true;
            }


            
return false;
        }


        
public virtual void RaisePostDataChangedEvent()
        
{
            
this.OnTextChanged(EventArgs.Empty);
        }


        
protected virtual void OnTextChanged(EventArgs e)
        
{
            
if (this.TextChanged != null)
            
{
                
this.TextChanged(this, e);
            }

        }


        
protected override void Render(HtmlTextWriter output)
        
{
            output.WriteLine(
"<input type=/"text/" name=/"{0}/" value=/"{1}/"",
                
this.UniqueID, this.Text);
        }

    }

    充分利用这个机制,我们可以作出更加复杂的服务器控件,并且可以与JavaScript相结合,将使用JavaScript修改的值在回发时自动加载,从而实现操作更加简洁便利的服务器控件。

     有几点需注意:
         1.  服务器控件写入客户端的Html中必须有一个<input>元素的name为服务器控件的UniqueID,否则将不会调用控件的 LoadPostData 方法;
         2.  服务器控件所在页面中所有的 Html <input> 元素的值都可以在 LoadPostData 的 postCollection 参数中找到,Key 值是<input> 元素的 name 属性,因此在服务器控件中可以定义多个 <input> 元素存放多个值,只要知道 name 就可以取到值;
         3.  RaisePostDataChangedEvent  方法中的事件在回发后触发,如果希望 AutoPostBack, 需实现 IPostBackEventHandler 接口,定义回发事件。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值