Asp.Net--コールバックテクノロジ

11966 ワード

コールバック・テクノロジーを実装するには、次の手順に従います.
1.ICallbakEventHandlerの実現
2.インタフェースの実装方法:RaiseCallbackEvent
3.GetCallbackResultの実現
方法
説明する
パラメータ
void RaiseCallbackEvent(string eventArgument)
コントロール目的のコールバックイベントの処理
イベントハンドラに渡すイベントパラメータを示します
string GetCallbackResult()
コントロール目的のコールバックイベントの結果を返します.
 
例を見てから説明します.
1.次のようなaspxページを作成します.
ページコード:
<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>    </title>

</head>

<body>

    <form id="form1" runat="server">

        <input type="text" id="txtname" name="txtname" onblur="CallServer(this.value,null)" />

        <span id="msg"></span>

        <input type="submit" value="Submit" />

        <script type="text/javascript">

            function Success(args,context){

                document.getElementById("msg").innerText=args;

            }

            

            function Error(args,context){

                document.getElementById("msg").innerText=args;

            }

        </script>

    </form>

</body>

</html>
  ,        CallServer  ,        Success Error   .    .
  ICallbackEventHandler  .
    :
    protected void Page_Load(object sender, EventArgs e)

    {

        string reference = Page.ClientScript.GetCallbackEventReference(this, "args", "Success", "", "Error", false);

        string callbackscript = "function CallServer(args,context){
" + reference + ";
}
"; Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "callback", callbackscript, true); } public string GetCallbackResult() { return ViewState["result"].ToString(); } public void RaiseCallbackEvent(string eventArgument) { if (eventArgument.Equals("admin")) { ViewState["result"] = " !"; } else { ViewState["result"] = " "; } }

この時、Pageについて見ました.ClientScript.GetCallbackEventReferenceの使用は、CallServerメソッドの定義も見られた.GetCallbackEventReferenceメソッドの定義を見てみましょう.
GetCallbackEventReference:クライアントパラメータへの参照を取得します.この関数を呼び出すと、サーバイベントに対するコールバックが開始する.すなわち、サーバにページをコミット可能な関数を返す.
ここで、例で使用する関数パラメータの解釈は以下の通りである.
GetCallbackEventReference(Control control,string argument,string clientcallback,string context,string clientErrorcallback,bool useAsync)
Control:クライアントコールバックを処理するサーバControl.
Argument:クライアントスクリプトからサーバのRaiseCallbackEventイベントに渡すパラメータ.
ClientCallback:イベントが正常に実行されたときの関数を処理するクライアント関数
context:コールバックを開始する前に、クライアントが計算するクライアントスクリプトで、スクリプトの結果がイベントハンドラに渡される.
ClientErrorcallback:イベントが失敗したときに実行する関数を処理するクライアント関数.(この例ではこのパラメータがありますが、実際には使用されていません)
useAsync:trueは非同期実行コールバックを表し、falseは同期実行コールバックを表す
ページを実行し、効果を確認し、ページがユーザーの判断を行う際にページ全体のリフレッシュを行わないことを発見するかどうかを確認する.
ページ実行プロセスは次のとおりです.
1.textboxがフォーカスを失った場合、CallServerメソッドを呼び出す
2.CallServerメソッドはthis.value値はRaiseCallbackEventメソッドのパラメータに入力され、判断され、GetCallbackResult()メソッドが呼び出されます.
3.このとき、ページで定義Successメソッドを再実行する.
実行ページのソースコードを表示すると、クライアントHTMLコードは次のようになります.
<html xmlns="http://www.w3.org/1999/xhtml">

<head><title>

	    

</title></head>

<body>

    <form name="form1" method="post" action="Default2.aspx" id="form1">

<div>

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />

<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGS4em2NMZLtsU4YN7EFuXT4tLpJrA==" />

</div>



<script type="text/javascript">

//<![CDATA[

var theForm = document.forms['form1'];

if (!theForm) {

    theForm = document.form1;

}

function __doPostBack(eventTarget, eventArgument) {

    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {

        theForm.__EVENTTARGET.value = eventTarget;

        theForm.__EVENTARGUMENT.value = eventArgument;

        theForm.submit();

    }

}

//]]>

</script>





<script src="/kongjian/WebResource.axd?d=KYfh-S4VutWcM_01AnkeqQ2&amp;t=633934581566718750" type="text/javascript"></script>





<script type="text/javascript">

//<![CDATA[

function CallServer(args,context){

WebForm_DoCallback('__Page',args,Success,"",Error,false);

}//]]>

</script>



        <input type="text" id="txtname" name="txtname" onblur="CallServer(this.value,null)" />

        <span id="msg"></span>

        <input type="submit" value="Submit" />

        <script type="text/javascript">

            function Success(args,context){

                document.getElementById("msg").innerText=args;

            }

            

            function Error(args,context){

                document.getElementById("msg").innerText=args;

            }

        </script>

    



<script type="text/javascript">

//<![CDATA[



WebForm_InitCallback();//]]>

</script>

</form>

</body>

</html>

注意ページのコード:
<script type="text/javascript">

//<![CDATA[

function CallServer(args,context){

WebForm_DoCallback('__Page',args,Success,"",Error,false);

}//]]>

</script>
       pageload      
    protected void Page_Load(object sender, EventArgs e)

    {

        string reference = Page.ClientScript.GetCallbackEventReference(this, "args", "Success", "", "Error", false);

        string callbackscript = "function CallServer(args,context){
" + reference + ";
}
"; Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "callback", callbackscript, true); }

この時、WebForm_を見てみましょう.DoCallbackメソッド
ソースコードのscriptコードの1つを下にします./kongjian/WebResource.axd?d=KYfh-S4VutWcM_01AnkeqQ2&t=633934581566718750
WebFormを検索DoCallbackメソッドコード、簡単に一部をリストします.
    var xmlRequest,e;

    try {

        xmlRequest = new XMLHttpRequest();

    }

    catch(e) {

        try {

            xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");

        }

        catch(e) {

        }

    }

    var setRequestHeaderMethodExists = true;

    try {

        setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);

    }

    catch(e) {}

    var callback = new Object();

    callback.eventCallback = eventCallback;

    callback.context = context;

    callback.errorCallback = errorCallback;

    callback.async = useAsync;


このコードを見ると、すでに確立されていたxmlHttpRequestオブジェクトが見つかります.後で言わないでください.