0

コントロールにアタッチされていないコードをトリガーする手動ポストバックを実現しようとしています。ポストバック中に特定のコントロールを参照する必要があり、結果をページのグリッドビューに更新する必要があるため、AJAX PageMethods を使用したくありません。

私はすでに他の 2 つの方法で動作していますが、何らかの理由で 3 つ目の方法は一度もデプロイされていませんが私の開発マシンでは問題なく動作しています。

コードビハインド (Page_load)

        switch (Request["__EVENTARGUMENT"]) {
            case "ItemReserved":
                GetAllStock();
                break;
            case "PendingItemRemoved":
                PopulatePending();
                break;
            case "StockInSubmitted":
                SubmitNewStock();    // this doesn't fire
                break;
        }

コードが「SubmitNewStock()」に達したらすぐにログ ファイルに書き込む行を挿入しました。ログは開発マシンに書き込まれましたが、Web サーバーには書き込まれませんでした。他の両方のポストバックは期待どおりに機能します。

ページスクリプト

    function ctxMenu_Reserve() {
        PageMethods.SetItemReserved(CGRefForMenu);
        __doPostBack('', 'ItemReserved');

        HideMouseMenu();
    }

    function ctxMenuPending_Remove() {
        PageMethods.RemovePendingItem(CGRefForPendingMenu);
        __doPostBack('', 'PendingItemRemoved');
    }

    function StockINSubmit(){
        SubmitPlaceHolder = document.getElementById('<%=PlaceholderStockInSubmit.ClientID %>');
        SubmitPlaceHolder.innerHTML = "Processing...";

        __doPostBack('', 'StockInSubmitted');  //Causes postback, but relevant code is not triggered once on my live server
    }

サイトをライブWebサーバーにデプロイすると、これが機能しない理由を知っている人はいますか?

StockINSubmit() は、モーダル ポップアップ ボックス内に配置された、動的に作成されたクライアント リンク ボタンから開始されることに注意してください。

        PlaceholderStockInSubmit.Controls.Add(
            new LinkButton() {
                OnClientClick = "StockINSubmit()",
                Text = "Submit",
                ID = "lnkStockInSubmit"
            });

StockINSubmit() は、そのボタンを含む DIV の HTML コンテンツを置き換えます。(「送信」をクリックすると、「処理中」ラベルに変わります)。それが問題を引き起こす理由はわかりませんが、言及する価値があると思いました.

4

1 に答える 1

0

やっと何が起きたのかが分かりました…

動的に作成されたリンク ボタンは、サーバー クリック (onClick) イベントの一部としてポストバックを実行していました (イベントをバインドしていませんでしたが)。私の開発マシンでは、OnClientClick イベントのポストバックが OnClick ポストバックよりも優れていたため、予想されるすべてのコードが通常どおり実行されていました。

何らかの理由で、サーバーに展開されると、サーバーの OnClick イベントが OnClientClick イベントを上回っていたため、OnClientClick イベントが提供していた追加の __EVENTARGUMENT 情報なしで完全なポストバックが発生していました。

これを回避するために、このサイトで、デフォルトのポストバックをキャンセルする方法を説明した別の投稿を見つけましたが、それでもクライアント側の JavaScript を実行します。

サーバー側のコードは次のように更新されました。

    LinkButton newButton = new LinkButton() {
        OnClientClick = "StockINSubmit()",
        Text = "Submit",
        ID = "lnkStockInSubmit"
    };
    newButton.Attributes.Add("onClick", "return false;");
    PlaceholderStockInSubmit.Controls.Add(newButton);

これは今では魅力のように機能しています:)

助けてくれてありがとう。

于 2012-11-21T16:55:53.877 に答える