Asp.Net2.0의 클라이언트 콜백은 전체 페이지를 제출하지 않고도 서버에 제출할 데이터를 제어할 수 있는 동시에 서버가 필요한 데이터만 다시 보내지 않고 반환할 수 있게 해주는 매우 흥미로운 방법입니다. .전체 페이지.
우선 아주 중요한 메소드인 GetCallbackEventRefernce에 대해 말씀드리겠습니다. 제가 이해한 내용이 틀릴 수도 있으니 지적해 주시기 바랍니다.
GetCallbackEventReference는 먼저 클라이언트 스크립트가 서버에 매개 변수를 전달할 수 있도록 하는 raiseCallbackEvent 메서드를 구현한 다음, GetCallbackEventRefernce 메서드에 등록한 매개 변수에 raiseCallBackEvent 메서드의 값을 반환합니다(실제로 클라이언트에 작성하려는 스크립트이기도 합니다). ). GetCallbackEventRefernce를 호출하려면 클라이언트 스크립트에서 두 개의 매개변수를 전달해야 합니다. 하나는 raiseCallbackEvent 이벤트에 전달될 값이고 다른 하나는 컨텍스트입니다.
첫 번째:
해당 매개변수의 의미는 다음과 같습니다.
ICallbackEventHandler 인터페이스를 구현합니다. 이전 페이지를 나타내려면 이것을 작성하세요.
두 번째: 클라이언트에서 서버의 raiseCallbackEvent 메서드로 전달하려는 값을 나타냅니다.
세 번째: 클라이언트에 작성하려는 js 함수와 동시에 서버는 계산된 데이터도 이 함수에 전달합니다. 이 함수 매개변수.
넷째: context가 정확히 무엇을 의미하는지 모르겠습니다. GetCallbackEventRefernce가 클라이언트에 보내는 코드는 다음과 같습니다.
WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false)
그러면 요청을 받으려면 어떻게 해야 할까요? 그 고객에게 어떻게 전화하나요? 세 가지 방법을 보았습니다.
첫 번째 방법은 백그라운드에서 공개 문자열을 작성하고 이를 Page_Load에 할당하는 것입니다. =Page.ClientScript.GetCallbackEventReference(this, "message", "ShowServerTime", "context") 여기에 주목하세요. .ClientScrip. 모든 클라이언트 스크립트를 관리하는 ClientScriptManager를 반환하기 때문입니다. 그런 다음 포그라운드 <%=공개 배경 문자열%>에 있는 버튼의 onclick 이벤트에서 다음과 같이 작은 실험 코드를 만듭니다.
Frontend ServerTime.aspx: 편의를 위해 쓸모 없는 HTML<%@ 페이지 언어="
를 많이 제거합니다.
C#" CodeFile="ServerTime.aspx.cs" Inherits="ServerTime_aspx" %>
<html>
<머리>
<title>서버 시간</title>
<script 언어="javascript">
함수 GetServerTime()
{
var 메시지 = '';
var 컨텍스트 = '';
<%=sCallBackFunctionInvocation%>
}
함수 ShowServerTime(timeMessage, 컨텍스트) {
Alert('서버의 현재 시간은:n' + timeMessage);
}
</스크립트>
</머리>
<본문>
<양식 id="MainForm" runat="서버">
<input type="button" value="서버 시간 가져오기" onclick="GetServerTime();"
</양식>
</본문>
</html>
백엔드:
시스템 사용;
System.Web.UI 사용;
공개 부분 클래스 ServerTime_aspx: Page,ICallbackEventHandler
{
//ICallbackEventHandler를 구현해야 합니다. public string sCallBackFunctionInvocation
void Page_Load(object sender, System.EventArgs e)
{
sCallBackFunctionInvocation = Page.ClientScript.GetCallbackEventReference(this, "message", "ShowServerTime", "context");
}
공개 문자열 raiseCallbackEvent(string eventArgument)
{
DateTime.Now.ToString()을 반환합니다.
}
}
실행하고 버튼을 클릭하면 결과는 다음과 같습니다.
두 번째 방법: 위 방법에서는 배경을 전경에 바인딩해야 하는데 바인딩하지 않으면 어떻게 되나요? 우리는 이렇게 합니다:
GetCallbackEventReference를 js 함수의 구현 콘텐츠로 직접 사용한 다음 이 js 함수를 클라이언트에 등록합니다.
프런트 엔드 TestPage 코드:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestPage.aspx.cs" Inherits="TestPage" %>
<html>
<머리>
<제목>제목 없는 페이지</제목>
<스크립트 유형="텍스트/자바스크립트">
기능 테스트()
{
var lb = document.getElementById("Select1");
//사용할 드롭다운 상자 var con = lb.options[lb.selectedIndex].text;
//선택한 드롭다운 상자의 텍스트를 가져온 다음 서버에서 출력되는 js 함수인 CallTheServer를 호출합니다. CallTheServer(con,'');
}
함수수신서버데이터(rValue)
{
Results.innerHTML = rValue;
}
</스크립트>
</머리>
<본문>
<양식 id="form1" runat="서버">
<div>
<ID 선택="선택1">
<옵션값=1 selected="선택됨">마우스 제자</option>
<옵션 값=2>우치와 사부</option>
</선택>
<br />
<br />
<input onclick="test()" value="서버에서 드롭다운 상자 텍스트 반환" type=버튼>
<br />
<br />
<스팬 ID="결과"></스팬>
<br />
</div>
</양식>
</본문>
</html>
백엔드 코드:
시스템 사용;
System.Data 사용;
System.Configuration 사용;
System.Collections 사용;
System.Web 사용;
System.Web.Security 사용;
System.Web.UI 사용;
System.Web.UI.WebControls 사용;
System.Web.UI.WebControls.WebParts 사용;
System.Web.UI.HtmlControls 사용;
공개 부분 클래스 TestPage: System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{
protected void Page_Load(개체 전송자, EventArgs e)
{
String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
문자열 콜백스크립트;
callbackScript = "함수 CallTheServer(arg,context)" +"{ " + cbReference + "} ;";
Page.ClientScript.RegisterStartupScript(this.GetType(),"abcdefg",callbackScript, true);
//네 번째 매개변수는 <script type="text/javascript"></script> 태그를 스크립트에 자동으로 추가할지 여부를 나타냅니다. 물론 추가해야 합니다.}
공개 문자열 raiseCallbackEvent(문자열 eventArgument)
{
return "선택한 항목은 다음과 같습니다." + eventArgument;
}
}
실행 결과는 다음과 같습니다.
세 번째 유형: 처음 두 개는 <input type="button"을 사용하는 HTML 컨트롤이므로 서버 버튼이면 어떻게 될까요? 물론, 백그라운드에서 서버 버튼의 onclick 속성을 추가할 수도 있습니다.
프런트 엔드 third.aspx 코드:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="third.aspx.cs" Inherits="third" %>
<html>
<머리>
<제목>제목 없는 페이지</제목>
</머리>
<본문>
<양식 id="form1" runat="서버">
<div>
<ID 선택="선택1">
<옵션 선택="선택됨" 값=1>마우스 제자</option>
<옵션 값=2>우치와 사부</option>
</선택>
<asp:Button ID="Button1" runat="server" Text="서버 버튼입니다" /></div>
<div id="div1" />
<스크립트 유형="텍스트/자바스크립트">
함수Re(ret)
{
document.getElementById("div1").innerHTML = ret;
경고(ret);
}
</스크립트>
</양식>
</본문>
</html>
코드 숨김:
시스템 사용;
System.Data 사용;
System.Configuration 사용;
System.Collections 사용;
System.Web 사용;
System.Web.Security 사용;
System.Web.UI 사용;
System.Web.UI.WebControls 사용;
System.Web.UI.WebControls.WebParts 사용;
System.Web.UI.HtmlControls 사용;
공개 부분 클래스 세 번째: System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{
protected void Page_Load(개체 전송자, EventArgs e)
{
//네 번째 매개변수는 null입니다. 더 이상 js 문자열에서 매개변수를 전달할 수 없기 때문입니다. str = Page.ClientScript.GetCallbackEventReference(this,"document.getElementById('Select1')._
options[document.getElementById('Select1').selectedIndex].text","Re",null);
//return false는 양식이 제출되지 않도록 하는 것입니다. Button1.Attributes.Add("onclick",str+";return false;");
}
#region ICallbackEventHandler 멤버
공개 문자열 raiseCallbackEvent(문자열 eventArgument)
{
if (eventArgument == "마우스 견습생")
{
return "쥐 견습생: 인생은 쥐와 같습니다. 헛간에 없으면 화장실에 있는 것입니다!";
}
또 다른
{
return "Master Wu Qiwa: 자신감 있고 자립적이며 낙천적";
}
}
#endregion
}
작은 팁, System.Web.UI.ICallbackEventHandler 작성을 마친 후 마우스를 위로 이동하면 System 앞에 작은 차트가 표시됩니다. 이를 클릭하면 자동으로 raiseCallbackEvent 코드가 작성됩니다.
세 번째는 최악의 느낌입니다!