ASPNET组件设计之传输机制的讨论
ASPNET页面如果是通过post请求到服务器框架将会遵行事件周期生成调用控件而控件(如果支持回传)则将加载回传数据并且映射成控件的服务器端事件就好像在重放客户的客户行为(客户按下一个按钮却引发服务器端控件的click事件)其中的机制如何?
ASPNET组件设计之传输机制的问题如果一个控件需要处理回传事件那么必须实现一个特定接口 IPostBackEventHandler接口:
public interface IPostBackEventHandler{
void RaisePostBackEvent(string eventArgument);
}
ASPNET组件设计之传输机制的另外一个接口
IPostBackDataHandler
{
bool LoadPostData( string postDataKey NameValueCollection postCollection);
void RaisePostDataChangedEvent();
}
一旦控件实现了这些接口页面框架就会自动在PostBack数据完成后调用控件的此接口IPostBackDataHandlerLoadPostData从而让控件读取post上来的数据PostDataKey为PostBack数据中的命名键名通过NameValueCollection[postDataKey]可以获得页面框架传递给控件的值控件应当读取此值进行自己内部状态更新反映状态变化如果控件返回真表示服务器控件状态改变此时页面框架会立即调用此控件的RaisePostDataChangedEvent方法此时控件应当自己定义该引发那些服务器控件对外提供的事件这些事件往往是控件编程者精心设计留给使用这控键的aspx编程者的代码舞台
至于另一个接口IPostBackEventHandler也是回传时候服务器调用的接口我们知道每一个控件都有一个UniqueID当客户端触发一个可以引起回传的客户端事件(譬如按下了submit按钮)那么自然HTTP Post数据到服务器端服务器页面框架进行到PostBack处理时候会检索控件是否支持IpostBackEventHandler接口并且查找控件的UniqueID发现支持就立即调用此接口的RaisePostBackEvent方法表示UniqueID的控件发生了一个需要捕获的事件很明显并非客户端所有事件都可以投射到服务器端只能够是能够引发Post Back(也就是能够提交表单数据到服务器的事件)的事件和控件注意这里严格要求了UniqueID必须在服务器端和客户端对应一致否则无法映射事件
值得控件编写者注意的是如果要实现接口需要如下实现接口而不是通常的仅仅接口方法名同名即可
void IPostBackEventHandlerRaisePostBackEvent(string eventArgument)
{
……
}
ASPNET组件设计之传输机制的实现接口方面也就是说接口针对页面框架实现的也由页面框架调用
另一方面在客户端能够引起回传的实际上仅有个HTML元素﹤inoput type=submit ﹥和﹤input type=image但是通过客户端脚本其他客户端事件也可导致回传数据到服务器端Page类提供了一系列的方法来帮助实现其他可引发回传的途径
public string GetPostBackClientEvent(
Control control
string argument
);
获取对客户端脚本函数的引用该函数在被调用时将导致服务器回发到窗体
public string GetPostBackClientHyperlink(
Control control
string argument
);
将 javascript: 追加到从 GetPostBackEventReference 调用的返回的开头从而使服务器上可以进行超级链接回发处理
public string GetPostBackEventReference(Control);
public string GetPostBackEventReference(Control string);
获取对客户端脚本函数的引用调用该函数将使服务器
如果一个控件确定通过以上方法确保客户端引发回传事件那么控件引用页将导致最终输出到客户端的HTML中包含脚本并且脚本中藏有如下隐含变量
﹤input type=hidden name=__EVENTTARGET value=﹥
﹤input type=hidden name=__EVENTARGUMENT value=﹥
﹤script language=javascript﹥
﹤!
function __doPostBack(eventTargeteventArgument)
{
var theform=document_ct;
theform__EVENTTARGETvalue= eventTarget;
theform__EVENTARGUMENTvalue= eventArgument;
}
﹥
﹤/script﹥
任何客户端脚本只要合法调用了__doPostBack方法即可实现回传到服务器端
并且服务器端也知道了是引发了那一个UniqueID得控件的事件
ASPNET组件设计之传输机制方面的内容就简单的向你介绍到这里希望对你学习ASPNET组件设计之传输机制有所帮助