服务器控件如何自动加载回发数据
2007-02-07 11:03
323 查看
以创建一个 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接口有两个需要实现的方法:LoadPostData 和 RaisePostDataChangedEvent 。
boolLoadPostData (stringpostDataKey, NameValueCollectionpostCollection) 为 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 接口,定义回发事件。
protected override void Render(HtmlTextWriter output)
...{
output.WriteLine("<input type = /"text/" value = /"{0}/">", this.Text);
}
但这样简单的代码实现的TextBox在页面刷新时无法保存在用户的输入,为了自动加载回发数据,这个控件需要实现IPostBackDataHandler接口(定义 ASP.NET 服务器控件为自动加载回发数据而必须实现的方法)。IPostBackDataHandler接口有两个需要实现的方法:LoadPostData 和 RaisePostDataChangedEvent 。
boolLoadPostData (stringpostDataKey, NameValueCollectionpostCollection) 为 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 接口,定义回发事件。
相关文章推荐
- Asp.Net 开发之(1) ---如何自动加载数据到页面或更新数据到数据容器中(基础控件)
- 如何实现进入首页自动加载action提取数据
- ListView加载完数据屏幕会自动和ListView的顶部对齐,而不是布局中最顶部的控件?
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEvent
- ASP.NET - 如何:在非分层 Web 服务器控件中显示站点地图数据
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 请问ATTC如何在表格数据从服务器动态加载后更新flash?
- 从服务器读取数据加载到Tree控件上
- Skyline软件二次开发初级——1如何在web页面中添加控件和加载三维地图数据
- (服务器控件)页面框架处理回发数据的过程
- ASP.NET - 如何:对照数据类型验证 ASP.NET 服务器控件
- Asp.net自定义服务器控件开发小技巧: 如何正确获得回传数据
- 黄聪:Jquery+DataTables插件,如何在ajax调用服务器数据后,自动给tr添加id属性
- 如何在smarty中增加类似foreach的功能自动加载数据
- C#中,datagridview与sql数据源绑定后,通过控件更改数据如何自动回写更新到数据源
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientSc
- 如何不用服务器控件提交数据
- 如何让在Html中特殊字符被数据加载时对于html标签的自动转义 补充
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)