13

現在、Google Chrome以外のすべてのブラウザーが、同じページにポストバックするasp.netボタンをクリックすると、Page_Loadイベント内でIsPostbackへの呼び出しをtrueとして登録するという奇妙な問題が発生しています。

これにより、ASP .Netページ内のIsPostbackプロパティが技術的に実装されている方法を見つけようとしましたが、これは私が見つけるのに苦労しています。

これまでの私の考えは、それが以下に関連している可能性があるということです。

  • リクエストのVERBタイプは、GETではなくPOSTです。
  • ビューステート情報を含む非表示の入力には情報が存在しないため、以前に送信された制御情報は利用できません。
  • リクエストヘッダーのhttpリファラーは現在のURLと同じです。

IsPostbackブールプロパティを決定するために使用される条件の実際の内訳を誰かが提供できますか?

注:問題を積極的に解決するためにこれを使用したいと考えているため、認識/理論ではなく実際の実装を探しています。また、MSDNを検索しましたが、これまで、メカニズムを正確にカバーする技術記事は見つかりませんでした。

よろしくお願いします、ブライアン。

4

3 に答える 3

13

このページは、__PREVIOUSPAGEフォーム値の存在を探します。

リフレクターから:

public bool IsPostBack
{
    get
    {   //_requestValueCollection = Form or Querystring name/value pairs
        if (this._requestValueCollection == null)
        {
            return false;
        }

        //_isCrossPagePostBack = _requestValueCollection["__PREVIOUSPAGE"] != null
        if (this._isCrossPagePostBack)
        {
            return true;
        }

        //_pageFlags[8] = this._requestValueCollection["__PREVIOUSPAGE"] == null
        if (this._pageFlags[8])
        {
            return false;
        }

        return (   ((this.Context.ServerExecuteDepth <= 0) 
                || (   (this.Context.Handler != null) 
                    && !(base.GetType() != this.Context.Handler.GetType())))
                && !this._fPageLayoutChanged);
    }
}
于 2011-04-13T14:11:20.547 に答える
4

ポストバックは、実際には、フォームをそれ自体に送信するだけでかなり簡単に機能します(ほとんどの場合)。javascriptコードは実際にあなたのページに置かれます:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

マークの回答は、実行されているサーバー側のコードを示しています。

于 2011-04-13T14:12:42.760 に答える
1

Postbackはそのように実装されていますか(Reflectorを使用):

public bool get_IsPostBack()
{
    if (this._requestValueCollection == null)
    {
        return false;
    }
    if (this._isCrossPagePostBack)
    {
        return true;
    }
    if (this._pageFlags[8])
    {
        return false;
    }
    return (((this.Context.ServerExecuteDepth <= 0) || ((this.Context.Handler != null) && !(base.GetType() != this.Context.Handler.GetType()))) && !this._fPageLayoutChanged);
}

したがって、これらすべてのパラメータを考慮しない限り、それを追跡することはできません。

于 2011-04-13T14:15:19.477 に答える