使用Server.Transfer时,.NET AJAX 1.0 Aysc回调修改表单操作

时间:2008-10-17 18:28:51

标签: asp.net asp.net-ajax

我有一个Web表单,我试图在使用.NET AJAX 1.0扩展时实现动态下拉列表。我已成功实现了所需的位,但有一个有趣的怪癖。

当我从第一个下拉列表中选择一个值时,我的回调就会发生,我的页面也会正确更新。我选择的下一个值,我收到以下错误:

  

Sys.WebForms.PageRequestManagerServerErrorException:   发生未知错误   在服务器上处理请求。   返回的状态代码是:404

不管我先使用什么控件,第一个请求都有效,第二个请求不然。查看我的IIS日志,我看到以下几行:

  

2008-10-17 14:52:14 W3SVC1 127.0.0.1   POST   /Aware/Xtend/mParticipant/NewPlannedService.aspx   WIN = Participant_1224255079212&安培;名称=参与者   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&安培;名称=参与者   80 - 127.0.0.1 404 0 0

正如您所看到的,我的帖子网址已完全更改。使用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

1 个答案:

答案 0 :(得分: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")
        );
    }