カスタム レンダリングされた HTML リンクによってトリガーされるカスタム イベントをインターセプトするための IPostBackEventHandler インターフェイスを実装するカスタム コントロール (ascx) があります。
このコントロールでは更新パネルを使用し、更新パネル内ではカスタム HTML リンクをレンダリングするリテラル コントロールを使用します。
リテラル コントロール内で HTML リンクをレンダリングするときは、次のコードで StringBuilder を使用します。
sb.AppendFormat ("<a href=\"{0}\" id=\"custom_iterator_id\">Text</a>",
this.Page.ClientScript.GetPostBackClientHyperlink(this, custom_string_param));
ハイパーリンクは正常にレンダリングされ、それらをクリックすると非同期ポストバックがトリガーされ、部分的な更新が開始されます (すべてのリンクが [更新] パネル内にレンダリングされるため)。
問題は、上記のコードでレンダリングされる __doPostBack を起動する前に、カスタム Javascript を実行する必要があることです。したがって、変更されたコードの簡略化されたバージョンは次のとおりです。
sb.AppendFormat ("<a href=\"javascript:JSFunc{0}\" id=\"custom_iterator_id\">Text</a>",
custom_string_param);
また、ascx マークアップでは、次のコードを使用します (更新パネルの内側または外側)。
<script language="javascript" type="text/javascript">
function JSFunc(param) {
// custom js code here ....
__doPostBack('<%=this.ClientID%>', param);
}
</script>
ここでの問題は、リンクをクリックすると、部分的なポストバックではなく完全なポストバックが実行されることです。上記のコードのより単純なバージョンもテストしましたが、href から __doPostBack を削除するか、リンク ( タグ) から onclick イベントを削除して、リンクに提供するカスタム js 関数に移動すると、完全なポストバックがトリガーされます。
ページにエラーはなく、どちらの場合もコードは正しく機能することに注意してください。ページは __doPostBack から返されたパラメーターに応じて正しくレンダリングされていますが、2 番目のケースでは、部分的なポストバックではなく完全なポストバックが発生しています。
何か案は?
前もって感謝します、
ジョージ