適用於我自己想只占用一個aspx、aspx.cs頁面的情況,不過我怎麼看都覺得我干嘛喜歡把簡單事情搞復雜,我真是白癡
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>無標題頁</title>
</head>
<body>
<form id="form1" runat="server">
<div><input id="dog" type="text" /><span><a href="javascript:void(0)" onclick="Dog()">狗狗</a></span></div>
<div><input id="rabbit" type="text" /><span><a href="javascript:void(0)" onclick="Rabbit()">兔兔</a></span></div>
</form>
</body>
<script type="text/javascript">
function Dog()
{
//str是要傳遞給服務器端處理的字符串;
//function=Dog是為了在服務器端判斷傳進來的參數串是Dog()提交的,
//然後執行"處理Dog()參數串的方法",以達到分別處理事件的目的;
var str="function=Dog";
var params=document.getElementById("dog").value;
//傳進來待處理參數,可以傳進來多個參數,用&(其它符號)隔開
str+="&dog="+params;
//在此處調用服務端注冊的函數
CallTheServer(str,'');
}
function Rabbit()
{
//str是要傳遞給服務器端處理的字符串;
//function=Rabbit是為了在服務器端判斷傳進來的參數串是Rabbit()提交的,
//然後執行"處理Rabbit()參數串的方法",以達到分別處理事件的目的;
var str="function=Rabbit";
var params=document.getElementById("rabbit").value;
str+="&rabbit="+params;
//在此處調用服務端注冊的函數,跟Dog方法調用的是同一個;
CallTheServer(str,'');
}
//回調結果處理函數,rValue是服務器端返回給客戶端的結果
function ReceiveServerData(rValue)
{
var str=new Array();
var temp=new Array();
//str[0]:function='value'是判斷返回結果是哪個方法返回的一個判斷標記
//str[1]:客戶端要處理的返回結果
str=rValue.split('&');
//temp[1]:value標記的值
temp=str[0].split('=');
//把標記賦給str[0]來判斷,拋棄temp變量數組
str[0]=temp[1];
if(str[0]=="Dog")
{
alert(str[1]);
}
if(str[0]=="Rabbit")
{
alert(str[1]);
}
}
</script>
</html>
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//引用System.Web.UI.ICallbackEventHandler接口
//一定要實現ICallbackEventHandler接口,用於指示控件可以作為服務器的回調事件的目標
public partial class AspNetNoRefresh_AspNetNoRefresh : System.Web.UI.Page, ICallbackEventHandler
{
private string str = "";//返回客戶端的結果
protected void Page_Load(object sender, EventArgs e)
{
//Page.ClientScript
//獲取用於管理腳本、注冊腳本和向頁添加腳本的 System.Web.UI.ClientScriptManager 對象。
//返回結果:一個 System.Web.UI.ClientScriptManager 對象
//ClientScriptManager對象 是一些在Web應用程序中定義用於管理客戶端腳本的方法,
//其中有一個方法重載:GetCallbackEventReference(……)
//string GetCallbackEventReference(Control control, string argument, string clientCallback, string context)
//獲取一個對客戶端函數的引用;調用該函數時,將啟動一個對服務器端事件的客戶端回調
//此重載方法的客戶端函數包含指定的控件、參數、客戶端腳本和上下文
//參數:control: 處理客戶端回調的服務器 System.Web.UI.Control。該控件必須實現
//System.Web.UI.ICallbackEventHandler接口並提供
//System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(System.String)方法
//argument: 從客戶端腳本傳遞給服務器端的一個參數
//System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(System.String)方法
//clientCallback: 一個客戶端事件處理程序的名稱,該處理程序接收成功的服務器端事件的結果
//context: 啟動回調之前在客戶端計算的客戶端腳本;腳本的結果傳回客戶端事件處理程序
//第一句是GetCallbackEventReference函數
string cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
//第二句為生成要注冊的客戶端調用的JS函數CallTheServer,參數跟在前台的JS裡書寫的一致
//此函數的內容為上一句參數引用的腳本
string callbackScript = "function CallTheServer(arg,context){" + cbReference + "};";
//第三句為注冊此腳本,利用RegisterStartupScript方法
//其中第一個參數為固定的;第二個參數提示的是要注冊腳本啟動的鍵;
//第三個是要注冊的腳本的內容;最後一個參數為true就啟用自動添加;
Page.ClientScript.RegisterStartupScript(this.GetType(), "abcdefg", callbackScript, true);
//經過第三句注冊後實際發送到客戶端的代碼為:
//WebForm_InitCallback();function CallTheServer(param,context)
//{WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false)};
}
/// <summary>
/// ICallbackEventHandler接口要實現的方法,處理以控件為目標的回調事件
/// </summary>
/// <param name="eventArgument">一個字符串,表示要傳遞到事件處理程序的事件參數</param>
public void RaiseCallbackEvent(string eventArgument)
{
//獲取function的值,以及截掉function後的參數串
//如果有需要循環取參數,截掉是為了縮短參數串,減少不必要的循環
//如果參數串為空,還可以結束循環
string[,] function = GetParams("function",eventArgument);
//根據取出的function的值,執行相應的方法
if (function[0,0] == "Dog")
{
//function[0,1]是已切除function的eventArgument參數串
string[,] dog = GetParams("dog",function[0,1]);
//---------對dog[0,0]操作開始------------
//返回客戶端的結果,有可能從多個方法返回,
//所以也需要添加標記,好讓客戶端根據相應的標記進行相應的處理
//這裡function=Dog就是標記
str += "function=Dog&";
str += "這是小狗狗:" + dog[0, 0];
//---------對dog[0,0]操作結束------------
}
//根據取出的function的值,執行相應的方法
if (function[0,0] == "Rabbit")
{
string[,] rabbit = GetParams("rabbit", function[0, 1]);
//---------對rabbit[0,0]操作結束------------
str += "function=Rabbit&";
str += "這是可愛小兔兔:" + rabbit[0, 0] + ";我最愛你了!";
//---------對rabbit[0,0]操作結束------------
}
}
/// <summary>
/// ICallbackEventHandler接口要實現的方法,返回以控件為目標的回調事件的結果
/// </summary>
/// <returns>str:返回客戶端的結果</returns>
public string GetCallbackResult()
{
return str;
}
/// <summary>
/// 對一串字符串處理,從字符串取出特定str的值,並返回截掉str的字符串,
/// </summary>
/// <param name="str">檢查argument是否存在str,存在的話,取出str的值</param>
/// <param name="argument">要處理的字符串</param>
/// <returns>var[0,0]:參數str的值</returns>
/// <returns>var[0,1]:截掉str的argument參數串</returns>
protected string[,] GetParams(string str, string argument)
{
string[,] var =new string[1,2];
if (argument.ToString().Trim() != "" && argument.Contains("&"))
{
string[] arr = argument.Split('&');//利用'&'分割字符串為字符串數組
for (int i = 0; i < arr.Length; i++)
{
if (arr[i].Contains(str))
{//檢查argument是否存在str,存在的話,取出=兩邊的值
string[] arrChild = arr[i].Split('=');
//判斷=左邊的值是否等於str,等於的話,把=號右的值賦給var[0,0];
//把切除str='value'的字符串賦給var[0,1]
if (arrChild[0].ToString().Trim() == str)
{
var[0, 0] = arrChild[1];
//切除str='value'+&的長度
//break:取出參數後,直接跳出循環,避免不必要的循環
var[0, 1] = argument.Substring(arr[i].Length + 1); break;
}
}
}
}//字符串的最後一個參數的處理
else if(argument.ToString().Trim() != "" && !argument.Contains("&"))
{
if (argument.Contains(str))
{
string[] arrChild = argument.Split('=');
//判斷=左邊的值是否等於str,等於的話,把=號右的值賦給var[0,0];
//把切除str='value'的字符串賦給var[0,1]
if (arrChild[0].ToString().Trim() == str)
{
var[0, 0] = arrChild[1];
//最後一個字符串沒有&符號,切除str='value'的長度即可
var[0, 1] = argument.Substring(argument.Length);
}
}
}
return var;
}
}