在Web开发中,客户端回调是一种在不重新加载整个页面的情况下更新页面的技术。这种技术通过JavaScript和服务器端代码的协同工作,实现了用户界面的局部更新。本文将探讨客户端回调的工作原理,以及它如何影响页面的生命周期。
客户端回调过程中,页面会经历一个修改过的页面生命周期。这个过程与标准的页面生命周期有所不同,因为它不会触发完整的页面加载流程。如果想了解更多关于客户端回调的信息,请访问相关链接。
客户端回调的主要缺点是它不会将输入数据从客户端发送到服务器。此外,在部分回发过程中,它也不会维护视图状态,因为客户端回调的页面生命周期中不会保存或触发SaveViewState事件。
让通过一个例子来理解这个过程。创建了一个简单的表单来收集个人信息,并且有一个提交按钮,该按钮会触发一个回调:
<table>
<tr>
<td>
<asp:Label id="lblFName" runat="server" Text="First Name"/>
</td>
<td>
<asp:TextBox ID="tbFName" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<asp:Label id="lblMName" runat="server" Text="Middle Name"/>
</td>
<td>
<asp:TextBox ID="tbMName" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<asp:Label id="lblLName" runat="server" Text="Last Name"/>
</td>
<td>
<asp:TextBox ID="tbLName" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<asp:Label id="lblAge" runat="server" Text="Age"/>
</td>
<td>
<asp:TextBox ID="tbAge" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<asp:Label id="lblMailId" runat="server" Text="Email"/>
</td>
<td>
<asp:TextBox ID="tbEMail" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<asp:Label id="lblSex" runat="server" Text="Sex"/>
</td>
<td>
<asp:TextBox ID="tbSex" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td colspan="2">
<input id="btnCallBack" type="button" value="Submit" onclick="InitiateCallBack();"/>
</td>
</tr>
</table>
服务器端代码示例如下:
public partial class Callback : System.Web.UI.Page, ICallbackEventHandler
{
string result;
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsCallback)
return;
// Creating a reference of Client side Method, that is called after callback on server
string cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "");
// Putting the reference in the method that will initiate Callback
string callbackScript = "function CallServer(arg, context) {" + cbReference + "; }";
// Registering the method
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);
}
public void RaiseCallbackEvent(String eventArgument)
{
string firstName = tbFName.Text;
// Read other data as well
}
public string GetCallbackResult()
{
return result;
}
}
客户端方法如下:
function InitiateCallBack() {
// Initiate the callback
CallServer("", '');
}
// Called after the server side processing is done
function ReceiveServerData(arg, context) {
// arg: hold the result
// Updating the UI
document.getElementById('divCallback').innerHTML = arg;
}
在填写完表单并提交之后,如果尝试使用控件的属性来访问输入的数据,将无法获取到它。让进一步检查表单集合,看看数据是否从客户端传递到服务器。
正如看到的,数据并没有在表单集合中传递。但是,让在JavaScript中,在发起回调请求之前,添加以下几行代码:
function InitiateCallBack() {
__theFormPostCollection.length = 0;
__theFormPostData = "";
WebForm_InitCallback();
// Intiate the callback
CallServer("", '');
}
现在让运行代码并像之前一样提交表单。现在,让检查表单集合。惊喜地发现,在表单集合中得到了所有的输入数据。这很好。
现在使用控件的属性来访问数据... ...得到了它。
现在让尝试看看这些额外的代码行做了什么。
// This clears the old data in form collection.
__theFormPostCollection.length = 0;
// It sets the forms data to empty
__theFormPostData = "";
// This method builds the body of the POST request when the page loads. The body of the page is a string
// (that is __theFormPostData) filled with the contents of the view state and all of the input fields in the form.
WebForm_InitCallback();