2

ASP.NET アプリケーションで UpdatePanel を使用しようとしています。残念ながら、アプリケーションで Server.Transfer() を使用している場合、これを行うことはできないようです。

アプリケーションのそのコンポーネントを変更することはできません - アーキテクチャは Server.Transfer() を広範囲に使用します - 基本的に、すべてのページ要求はこのメソッドを通過します。この問題の回避策はありますか? フルページのポストバックをしなければならないことは、最近では流行っていません...

4

3 に答える 3

4

私はそれを持っている!奇妙な外国語のブログをありがとう Og :)

これを修正するには、ASP.NET AJAX クライアント側フレームワークに、部分的な要求を Server.Transfer() 呼び出しの実際のターゲットに直接向けるよう指示するだけです。私は起こりうる副作用を非常に恐れています (これが何をスキップするかは誰にもわかりません - インフラストラクチャには目的があります) が、これまでのところうまく機能しているようです.

これは、私のページの Load イベントで呼び出される問題を修正するメソッドです。

    ///
    /// Adds to the page a JavaScript that corrects the misbehavior of AJAX when a page is target of a Server.Transfer call.
    ///
    protected void AjaxUrlBugCorrection()
    {
        string actualFile = Server.MapPath(AppRelativeVirtualPath);
        string redirectFile = Server.MapPath(Context.Request.FilePath);
        string baseSiteVirtualPath = HttpRuntime.AppDomainAppVirtualPath;

        if (actualFile != redirectFile)
        {
            System.Text.StringBuilder sbJS = new System.Text.StringBuilder();
            string actionUrl = string.Format("'{0}'", baseSiteVirtualPath + AppRelativeVirtualPath.Replace("~", String.Empty));
            sbJS.Append("Sys.Application.add_load(function(){");
            sbJS.Append(" var form = Sys.WebForms.PageRequestManager.getInstance()._form;");
            sbJS.Append(" form._initialAction = " + actionUrl + ";");
            sbJS.Append(" form.action = " + actionUrl + ";");
            sbJS.Append("});");
            ClientScript.RegisterStartupScript(this.GetType(), "CorrecaoAjax", sbJS.ToString(), true);
        }
    }
于 2009-12-05T12:24:31.663 に答える
0

これはより適切な方法で機能するはずです:

コントロールのイベント ハンドラから呼び出す場合Server.Transferは、更新パネルの Triggers セクションでそのコントロールを PostBackTrigger として登録するだけです。

<Triggers>
    <asp:PostBackTrigger ControlID="controlId" />
</Triggers>
于 2013-08-07T09:13:52.153 に答える