“無重新整理頁面”,只是一種不確切的效果描述(其實還有其他各種方法來實現這個效果),更確切的說法是:在頁面上用JavaScript調用伺服器端的一個方法,然後處理返回的資料。實現它最標準的方法當然是XMLHTTP。但是,程式員都是懶惰的傢伙,每個人都希望能有更方便的方法,或者,更佳的封裝。比如,Lostinet的Rane就是對XMLHTTP的一個很好的封裝。
終於,在ASP.NET 2.0裡面,我們可以輕鬆的來做到這點了。伺服器端任何實現了System.Web.UI.ICallbackEventHandler介面的控制項,都可以通過RaiseCallbackEvent()方法來處理從頁面上的JS指令碼傳遞過來的請求和資料,處理後,再將結果傳回給頁面。這項能力的底層仍然是XMLHTTP。
首先來看看JavaScript是如何調用伺服器端的方法的:
<script language="javascript" type="text/javascript">
function ClientMethod()
{
//獲得伺服器控制項(ControlName為控制項名稱)
var Control = document.getElementById("ControlName");
//ServerMethod為伺服器方法名,<%=SplitChar %>為一特定字元(為了避免參數中帶有分割符),
//Control.value為ServerMethod的參數(即控制項的值)
var arg = "ServerMethod<%=SplitChar %>" + Control.value;
//啟用一個對伺服器端事件的用戶端回調
<%= ClientScript.GetCallbackEventReference(this, "arg", "Result", "") %>;
}
//處理用戶端回調結果
function Result(result)
{
alert(result);
}
</script>
下面繼續來看看伺服器端方法:
首先//定義一個分隔字元
public char SplitChar = (char)14;
首先要實現ICallbackEventHandler介面。public string str_content;
public void RaiseCallbackEvent(string the_string)
{
str_content = the_string;
}
public string GetCallbackResult()
{
//拆分由用戶端傳過來的參數
string[] parts = str_content.Split(SplitChar);
//產生ServerMethod的參數隊列
object[] theArgList = new object[parts.Length - 1];
for (int i = 1; i < parts.Length; i++)
{
theArgList[i - 1] = parts[i];
}
//調用ServerMethod
return (string)GetType().GetMethod(parts[0]).Invoke(this, theArgList);
}
// 返回指定控制項的Html代碼
private string RenderControl(Control control)
{
StringWriter writer = new StringWriter(CultureInfo.InvariantCulture);
HtmlTextWriter Htmlwriter = new HtmlTextWriter(writer);
control.RenderControl(Htmlwriter );
Htmlwriter .Flush();
Htmlwriter .Close();
return writer .ToString();
}