.NET AJAX 1.0 Ayscコールバックは、Server.Transferの使用時にフォームアクションを変更します
-
03-07-2019 - |
質問
.NET AJAX 1.0拡張機能の使用時に動的ドロップダウンリストを実装しようとしているWebフォームがあります。必要なビットを正常に実装しましたが、興味深い癖があります。
最初のドロップダウンリストから値を選択すると、コールバックが発生し、ページが正しく更新されます。次の値を選択すると、次のエラーが表示されます。
Sys.WebForms.PageRequestManagerServerErrorException: 不明なエラーが発生しました サーバーでリクエストを処理します。 返されたステータスコード:404
最初に使用するコントロールに関係なく、最初の要求は機能しますが、2番目の要求は機能しません。 IISログを見ると、次の行が表示されます。
2008-10-17 14:52:14 W3SVC1 127.0.0.1 役職 /Aware/Xtend/mParticipant/NewPlannedService.aspx WIN = Participant_1224255079212& Title = Participant 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 = Participant 80-127.0.0.1 404 0 0
ご覧のとおり、私の投稿URLは完全に変更されています。 Fiddlerを使用して要求/応答を監視すると、サーバーからの応答でこれを確認できます。
| formAction || NewPlannedService.aspx |
これは単に実行されているページの名前であり、相対パスとクエリ文字列は削除されています。
この問題を解決するには、非同期コールバックメソッドの最後に次を追加します。
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 でしたp>
解決
この問題を解決するために、次のコードで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")
);
}