我正在尝试在我的 ASP.NET 应用程序中使用 UpdatePanel。不幸的是,如果我在我的应用程序中使用 Server.Transfer() ,我似乎无法做到这一点。
修改应用程序的那个组件是不可能的——架构广泛使用 Server.Transfer()——本质上,每个页面请求都通过这个方法。是否存在针对此问题的任何解决方法?如今,不得不进行整页回发是如此不时尚......
我正在尝试在我的 ASP.NET 应用程序中使用 UpdatePanel。不幸的是,如果我在我的应用程序中使用 Server.Transfer() ,我似乎无法做到这一点。
修改应用程序的那个组件是不可能的——架构广泛使用 Server.Transfer()——本质上,每个页面请求都通过这个方法。是否存在针对此问题的任何解决方法?如今,不得不进行整页回发是如此不时尚......
我懂了!感谢 Og 提供奇怪的外语博客:)
为了解决这个问题,我可以简单地告诉 ASP.NET AJAX 客户端框架将部分请求直接指向 Server.Transfer() 调用的实际目标。我很害怕可能的副作用(谁知道这会跳过什么——基础设施确实有目的),但到目前为止它似乎运行良好。
这是解决问题的方法,在我的页面的 Load 事件中调用:
///
/// Adds to the page a JavaScript that corrects the misbehavior of AJAX when a page is target of a Server.Transfer call.
///
protected void AjaxUrlBugCorrection()
{
string actualFile = Server.MapPath(AppRelativeVirtualPath);
string redirectFile = Server.MapPath(Context.Request.FilePath);
string baseSiteVirtualPath = HttpRuntime.AppDomainAppVirtualPath;
if (actualFile != redirectFile)
{
System.Text.StringBuilder sbJS = new System.Text.StringBuilder();
string actionUrl = string.Format("'{0}'", baseSiteVirtualPath + AppRelativeVirtualPath.Replace("~", String.Empty));
sbJS.Append("Sys.Application.add_load(function(){");
sbJS.Append(" var form = Sys.WebForms.PageRequestManager.getInstance()._form;");
sbJS.Append(" form._initialAction = " + actionUrl + ";");
sbJS.Append(" form.action = " + actionUrl + ";");
sbJS.Append("});");
ClientScript.RegisterStartupScript(this.GetType(), "CorrecaoAjax", sbJS.ToString(), true);
}
}
这应该以更适当的方式工作:
如果您Server.Transfer
从控件的事件处理程序调用,只需将该控件注册为更新面板的触发器部分中的 PostBackTrigger:
<Triggers>
<asp:PostBackTrigger ControlID="controlId" />
</Triggers>
Response.Write("window.open('新标签页链接','_blank');"); Response.Write("this.window.location='链接到另一个页面';");