0

.NET AJAX 1.0 拡張機能を使用して動的ドロップダウン リストを実装しようとしている Web フォームがあります。必要なビットを正常に実装しましたが、興味深い癖があります。

最初のドロップダウン リストから値を選択すると、コール バックが発生し、ページが正しく更新されます。次の値を選択すると、次のエラーが表示されます。

Sys.WebForms.PageRequestManagerServerErrorException: サーバーで要求を処理中に不明なエラーが発生しました。返されたステータス コード: 404

最初に使用するコントロールに関係なく、最初のリクエストは機能し、2 番目のリクエストは機能しません。IIS ログを見ると、次の行が表示されます。

2008-10-17 14:52:14 W3SVC1 127.0.0.1 POST /Aware/Xtend/mParticipant/NewPlannedService.aspx WIN=Participant_1224255079212&Title=参加者 80 - 127.0.0.1 200 0 0

2008-10-17 14:52:20 W3SVC1 127.0.0.1 POST /Aware/mParticipant/NewPlannedService.aspx WIN=Participant_1224255079212&Title=参加者 80 - 127.0.0.1 404 0 0

ご覧のとおり、投稿の URL が完全に変更されました。Fiddler を使用して要求/応答を監視すると、サーバーからの応答でこれを確認できます。

|formAction||NewPlannedService.aspx|

これは単に実行中のページの名前であり、相対パスとクエリ文字列は省略されています。

この問題を解決するには、Async コールバック メソッドの最後に次を追加します。

this.Form1.Action = Request.Url.PathAndQuery

しかし、これは信じられないほど不自由に思え、カビの生えたチーズのようなにおいがします. 誰でも私を正しい方向に向けることができますか?

更新:さらに調べたところ、NewPlannedService.aspx が元の実行ページではないことがわかりました。Page1.aspx が実行され、Server.Transfer("/folder/NewPlannedService.aspx") が呼び出されました。したがって、ブラウザーの URI はhttp://whatever.com/Page1.aspxでしたが、実際に実行されていたページはhttp://whatever.com/folder/NewPlannedService.aspxでした。

4

1 に答える 1

1

この問題を解決するために、次のコードを含む Ajax.Server.Transfer.Fixer.js という JavaScript ファイルを作成しました。

var orginalFormAction = null;

//capture the current form action value
function BeginRequestHandler() {
  orginalFormAction = theForm.action;
}

//set the form action value back to the
//correct value
function EndRequestHandler() {
  theForm.action = orginalFormAction;
  theForm._initialAction = orginalFormAction;
}

function RegisterRequestHandlers() {

  if (typeof (Sys) != "undefined") {

    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
    Sys.Application.notifyScriptLoaded();

  }
}

//register request handlers after the application 
//has successfully loaded.
Sys.Application.add_load(RegisterRequestHandlers);

次に、次の行を Page_Load イベントに追加しました。

protected void Page_Load(object sender, EventArgs e)
    {
      PageScriptManager.Scripts.Add(
        new ScriptReference("~/Script/Ajax.Server.Transfer.Fixer.js")
        );
    }
于 2008-10-18T00:43:56.067 に答える