0

在我的asp.net 应用程序中,两个按钮调用了一个名为refreshView 的javascript 函数,下面是函数refreshView。

function RefreshView() {
                        __doPostBack('ButtonApply', '')
                        window.parent.location.href = "dashboardtree.aspx"
                    }

在 IE 中,这工作正常,但在 firefox 和 safari 中,页面刷新(由于 window.parent.location) - 但从不调用 doPostBack (我能够使用跟踪点告诉这一点,并且调用的子将值存储到数据库,值也没有被存储, sub 永远不会被命中)。下面是 sub 的第一行。

 Private Sub ButtonApply_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonApply.Click

谁能明白为什么这行不通?我想我总是可以用 pageMethods 替换 doPostBack 并创建一个新的子/函数 - 但我想以目前的方式完成它。谢谢你。

4

2 回答 2

3

不要在 JavaScript 例程中同时执行重定向和回发。你应该做的是在你的回发逻辑完成后重定向。您只会知道它何时在 Codebehind 中完成,或者您的 Javascript 是否收到某种异步回调。在当前状态下,您的 JavaScript 例程不知道您的回发何时完成。

你正在制造冲突。您实际上在做的是告诉页面发布并同时重定向到其他地方。由于这个事实,FireFox 和 Safari 很可能忽略了__doPostBack()这一点。

这就是我会做的事情:

public void Page_Load(object sender, EventArgs e)
{
  string target = Request["__EVENTTARGET"];
  //if parameter equals "ButtonApply"
  //{       
  //    Do whatever, Then...
  //    Response.Redirect("dashboardtree.aspx"); <- you may need to modify the url depending on your structure
  //}
}

编辑

...about the response.redirect - this will not work for me because the page that contains the post back, is an iframe inside another page...

抱歉,我错过了 window.parent。

那么我推荐的是使用ajax。简而言之,您将使用 ajax 调用服务器端方法,该方法将执行您的逻辑(您当前在回发中执行的操作)。完成后,当进程完成(以及是否成功)时,将在回调中通知客户端。成功完成后,您将执行重定向。

网上有很多这样的例子,我给大家举几个:

于 2012-06-19T18:43:11.940 回答
0

为了在每次回发完成后执行一个方法,您可以通过 PageRequestManager 将该方法添加到处理程序列表中。(参见: http: //msdn.microsoft.com/en-us/library/bb311028)方法执行后,如有必要,您可以将其从处理程序列表中删除。

function Reload() {
    Sys.WebForms.PageRequestManager.getInstance().remove_pageLoaded(Reload);
    window.parent.location.href = "dashboardtree.aspx";
}

function RefreshView() {
    Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(Reload);
    __doPostBack('ButtonApply', '');
}
于 2012-06-19T19:12:21.370 回答