2008-10-17 46 views
0

我有一個Web表單,我正嘗試使用.NET AJAX 1.0擴展實現動態下拉列表。我已經成功實現了所需的位,但有一個有趣的怪癖。.NET AJAX 1.0 Aysc回調修改表單操作使用Server.Transfer時

當我從我的第一個下拉列表中選擇一個值時,發生了我的回調,並且我的頁面正確更新。接下來的值I選擇,我收到以下錯誤:我用什麼控制第一,要求作品

Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred while processing the request on the server. The status code returned was: 404

Reguarless和第二個沒有。看看我的IIS日誌,我看到以下幾行:

2008-10-17 14:52:14 W3SVC1 127.0.0.1 POST /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已經完全改變。使用招觀看請求/響應,我可以看到這個從服務器的響應:

|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

回答

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") 
     ); 
    }