Есть ли решение проблемы UpdatePanel + Server.Transfer?
Я пытаюсь использовать UpdatePanel в моем приложении ASP.NET. К сожалению, кажется, что я не могу сделать это, если я использую Server.Transfer() в моем приложении.
Изменение этого компонента приложения невозможно - архитектура широко использует Server.Transfer() - по сути, каждый запрос страницы проходит через этот метод. Существует ли какое-либо решение этой проблемы? Необходимость делать постбэки на всю страницу так не модна в наши дни...
3 ответа
Я понял! Спасибо Ог за странные блоги на иностранных языках:)
Чтобы это исправить, я могу просто сказать клиентской инфраструктуре 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='ссылка на другую страницу';");