1

カスタム レンダリングされた 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 番目のケースでは、部分的なポストバックではなく完全なポストバックが発生しています。

何か案は?

前もって感謝します、

ジョージ

4

1 に答える 1

0

で __doPostBack を呼び出すことはできないと思いますClientID。実際には を使用して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:、文字列の先頭に追加されます。

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

PostBackOptions options = new PostBackOptions(this, custom_string_param)
options.RequiresJavaScriptProtocol = false;
Page.ClientScript.GetPostBackEventReference(options)
于 2011-12-11T13:52:40.127 に答える