【问题标题】:onRowCommand gets fired again on refreshing the pageonRowCommand 在刷新页面时再次被触发
【发布时间】:2009-10-09 08:15:38
【问题描述】:

在我的网页中,我有一个 gridview,其中包含下载文件的链接和在单独页面中打开另一个网站的链接。当我单击链接 gridview onRowCommand 被执行并且网站在单独的窗口中打开。之后,当我刷新网页,gridview onRowCommand 再次执行,并再次在单独的窗口中打开网站,这是我不想要的。我希望当我点击链接导航到另一个网站时,只有它应该去。我的意思是在页面刷新时,gridview onRowCommand 应该不被执行。

我正在使用 Page.RegisterStartupScript 在单独的窗口中打开另一个网站。

ASP.net 2.0

谢谢

-------------------------------------------代码--- -------------

protected void grdDisplayView_onRowCommand(object sender, GridViewCommandEventArgs e) { 字符串路径 = e.CommandArgument.ToString();

        if (path.Contains("http"))
        {
            StringBuilder sbString = new StringBuilder("<script language='javascript'>");
            sbString.Append("window.open('");
            sbString.Append("http://www.yahoo.com','', 'status=no,width=600,height=500,toolbar=yes,menubar=yes,location=yes,scrollbars=yes,resizable=yes,titlebar=yes,top=198,left=305');");
            sbString.Append("</script>");

            if ((!Page.ClientScript.IsStartupScriptRegistered("clientScriptExportView")))
            {
                Page.RegisterStartupScript("clientScriptExportView",sbString.ToString());
            }

        }
        else
        {
            //download file which is locally
            path = Server.MapPath(path);
            System.IO.FileInfo file = new System.IO.FileInfo(path);

                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
                HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
                HttpContext.Current.Response.ContentType = "Application/octet-stream";
                HttpContext.Current.Response.WriteFile(file.FullName);
                HttpContext.Current.Response.End();


        }

    }

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    如果用户点击刷新按钮,之前请求中发送的任何信息都会被再次发送。也就是说,如果用户点击了一个按钮,如果他按下了刷新按钮,按钮点击动作将被重新发送到服务器。

    我相信没有简单的方法来区分原始按钮点击和通过页面刷新发送的按钮点击。

    这是一个经典问题,可以使用 Post/Redirect/Get 模式来解决(以一种不太容易的方式)。见here(维基)/here

    我不确定这是否能解决您的问题,但希望它能让您走上正确的道路!希望对您有所帮助!

    请参阅this SO 帖子,该帖子描述了如何在 ASP.NET Web 窗体中实现该模式。

    【讨论】:

    • 感谢您的回复!这不是我想要的。我只想知道如何在页面刷新时停止执行 gridview onRowCommand 事件,如果 gridview 中有一个链接可以在单独的窗口中打开另一个网站。页面刷新就像页面加载。在页面加载期间,此事件不会自动执行。为什么它会在页面刷新时执行?如果我删除在单独窗口中打开新网站的链接,onRowCommand 事件不会被执行。
    • 您好,页面刷新与第一次加载页面不同。页面刷新与从浏览器发送到服务器的 LAST 请求相同。如果删除链接,那么在正常情况下如何单击链接?仅当刷新之前页面上的最后一个操作是单击此链接时,刷新才会触发 RowCommand 事件。如果您不单击链接并刷新页面,则不需要触发 row 命令,因为它在最后一个请求中没有触发。
    • 您可以创建一个带有两个按钮的简单表单。单击按钮会显示一个简单的消息框“按钮 1”和“按钮 2”。现在运行应用程序并单击第一个按钮。您将看到消息“按钮 1”。现在刷新页面。您应该再次看到消息“按钮 1”。现在单击第二个按钮。您将看到消息“按钮 2”。现在刷新页面,您应该会看到显示的“按钮 2”。通过这个小练习,您可以了解页面刷新的工作原理。 IE。它会复制您页面上的最后一个操作。希望这会有所帮助:)
    【解决方案2】:

    也许这不是你想要的,但我应该使用:

      <a href="new page" target="_blank" >text</a>
    

    在gridview itemtemplate中

    这确保没有执行任何代码:) 但我不知道这是不是你想要的

    您可以在 ondataitembound 事件中创建链接

    如果您需要后面的代码,您还可以使用 dataitembound 事件将 javascript 添加到例如 imagebutton 以启动新页面并拥有 onclick 事件后面的代码:

     imagebutton.Attributes.Add("onclick", "window.open('otherpage.aspx?courseid=" + id+ "')")
    

    【讨论】:

    • 你能告诉我你需要在后面的代码中做什么吗?
    • 你在page_load中填充gridview if(!Page.ispostback())
    • 你好,你如何填写:grdDisplayView 你使用 !page.ispostback 的东西吗?以及如何设置命令参数?它来自(图像)按钮吗?
    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2012-03-12
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多