2011-10-31 6 views
1

カスタムレンダリングされたHTMLリンクによってトリガされたカスタムイベントをインターセプトするためのIPostBackEventHandlerインターフェイスを実装するカスタムコントロール(ascx)があります。hrefの外の__doPostBackは全面ポストバックを引き起こします

このコントロールでは、更新パネルを使用しています。更新パネル内では、カスタムHTMLリンクをレンダリングするリテラルコントロールを使用します。

私は次のコードでのStringBuilderを使用するリテラルコントロール内のHTMLリンクのレンダリング:

sb.AppendFormat ("<a href=\"{0}\" id=\"custom_iterator_id\">Text</a>", 
    this.Page.ClientScript.GetPostBackClientHyperlink(this, custom_string_param)); 

ハイパーリンクが微細化されており、それらをクリックしたとき、非同期ポストバックがトリガーと部分更新があるさ(リンクはすべてUpdateパネル内にレンダリングされるため)

問題は、上記のコードでレンダリングされる__doPostBackを発生させる前にカスタムJavascriptを実行する必要があることです。ここでの問題は、ときということです

<script language="javascript" type="text/javascript"> 
function JSFunc(param) { 
// custom js code here .... 
__doPostBack('<%=this.ClientID%>', param); 
} 
</script> 

:私は(更新パネルの内側または外側の)次のコードを使用しASCXマークアップでも

sb.AppendFormat ("<a href=\"javascript:JSFunc{0}\" id=\"custom_iterator_id\">Text</a>", 
    custom_string_param); 

:だから、ここで変更されたコードの簡易版でありますリンクがクリックされると、完全なポストバックが実行され、部分的なポストバックは実行されません。私も上記のコードのより単純なバージョンをテストし、リンク(タグ)からhrefまたはonclickイベントから__doPostBackを削除し、それをカスタムjs関数に移動すると、リンクに完全なポストバックがトリガされます。

ページにエラーはなく、両方の場合にコードが正しく機能することに注意してください。ページは__doPostBackから返されたパラメータによって正しくレンダリングされますが、2番目のケースでは部分的なポストバックの代わりにフルが発生しています。

アイデア?事前に

おかげで、

ジョージ

+0

質問ごとに1つの回答を[承諾](http://meta.stackexchange.com/q/5234)としてマークすることができますか? –

答えて

0

私はあなたがClientIDで__doPostBackを呼び出すことはできませんと思います。それは実際にUniqueIDWithDollarsを使用しますが、一般的にはASP.NET Webフォームで私は言う:あなたはを知りたくありません。

このメソッドを呼び出すと、ポストバックの仕組みの詳細が抽象化されているので、コードのフレームワークを尋ねるほうがよいでしょう。幸いなことに、そのための特別な方法があります。詳細を処理します。あなたのコードでは、それはこのようなもののようになります。

<script language="javascript" type="text/javascript"> 
    function JSFunc(param) { 
     // custom js code here .... 
     <%= Page.ClientScript.GetPostBackEventReference(this, custom_string_param) %> 
    } 
</script> 

をこれは、クライアントスクリプトマネージャは、ユーザーコントロール(this)と任意のカスタムイベント引数(custom_string_param)への参照を使用して、JavaScriptコードの断片を作成してみましょう。

ただし、1つの注意点があります。このように呼び出すと、文字列の先頭にjavascript:が追加されます。

この動作をオーバーライドするには、最初の引数としてPostBackOptionsのインスタンスを受け入れ、RequiresJavaScriptProtocolプロパティをfalseに設定したインスタンスを受け入れるGetPostBackEventReferenceのオーバーロードを使用する必要があります。

PostBackOptions options = new PostBackOptions(this, custom_string_param) 
options.RequiresJavaScriptProtocol = false; 
Page.ClientScript.GetPostBackEventReference(options) 
関連する問題