none
带参数的页面转向新页面,防止重复提交 RRS feed

  • 问题

  • 有页面A.aspx里,

    有一个链接<a href="B.aspx?ID=1">指向B页面</a>

    B.aspx页面代码里:

    protected void Page_Load(object sender, EventArgs e)
        {
             if (!Page.IsPostBack)
            {

             if(Request.QueryString["ID"]!=null)

                    {

               对数据进行操作

                     }
             }

        }

    发现这样写完之后,在B.aspx的页面里"刷新"该页面,它会对"数据进行重复操作"

    求解:怎么做才能让B.aspx页点击"刷新"时,不要对数据进行重复操作.谢谢.

    • 已移动 Bob Shen 2012年5月11日 6:33 (发件人:Visual C#)
    2012年5月4日 14:42

答案

  • 你好,可以考虑一下设计的问题。

    B.aspx?ID=2,如果是这样的URL,那么表示要发送的是一个GET请求。作为一个GET请求,那么实际上应该是向服务器获取一个资源。一般用来读取数据库的内容。如果要更新数据库,那么应该发送一个POST请求。

    浏览器发生一个POST请求之后,如果刷新,那么浏览器会提醒你表单可能重复提交了。所以一般而言,发生一个POST请求之后需要让浏览器转向,可以转向到同一个页面,也可以是其他页面。这样用户再点击刷新就不会重复提交数据了。

    在你的情况里,可以考虑点击B.aspx?ID=2之后,等完成了数据库更新,再转到C.aspx或者A.aspx页面,防止重新提交。

    http://en.wikipedia.org/wiki/Post/Redirect/Get

    • 已标记为答案 阿波 2012年5月16日 13:45
    2012年5月11日 10:00
    版主

全部回复

  • 你好,恐怕你要判断这个页面是否正常加载过(用Session)比如:

     if (!Page.IsPostBack)
            {
             if(Request.QueryString["ID"]!=null && Session["isfirst"]==null)
                    {
               对数据进行操作
               Session["isfirst"] = true;
             }
    不过注意,请及时释放这个Session(跳转到其它页面时候)

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月5日 2:45
  • 刷新的事情解决了,

    但后退该页面之后,

    再<a href="B.aspx?ID=2">指向B页面</a>进行数据提交,,好像数据列加不上去了,

    B.aspx页面代码里:

    public static DataTable Cpdt;//购物车的数据列对象

    protected void Page_Load(object sender, EventArgs e)
        {

            if (Session["CPBY"] == null)
            {
                Creatbt();
                Session["CPBY"] = Cpdt;
            }
            else
            {
                Cpdt =(DataTable)Session["CPBY"];
            }

             if (!Page.IsPostBack&&Request.QueryString["ID"]!=null&& Session["isfirst"] == null)
            {

             添加购物车的数据列对象

            Cpdt.Rows.Add(Myrow);

             Session["isfirst"] = true;

             }

    GridView1.DataSource = Cpdt;
    GridView1.DataBind();

        }


    • 已编辑 阿波 2012年5月5日 3:39
    2012年5月5日 3:19
  • 后退的那个页面page_Load中请加上这一句代码:

    Session["isfirst"] =null;


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月5日 5:06
  • 后退的那个页面page_Load中请加上这一句代码:

    Session["isfirst"] =null;

    后退页面后马上再点击其它产品提交B.aspx,

    数据列还是不会自动增加,

    但如果"后退页面"后再"刷新"一下页面再提交到B.aspx,

    数据列倒会自动增加

    还不是很完美!

    2012年5月5日 15:29
  • 或许你可以参考乱马客的这篇文章,判断是否执行Refresh。

    http://www.dotblsogs.com.tw/rainmaker/archive/2009/09/25/10770.aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月11日 8:29
  • 你好,可以考虑一下设计的问题。

    B.aspx?ID=2,如果是这样的URL,那么表示要发送的是一个GET请求。作为一个GET请求,那么实际上应该是向服务器获取一个资源。一般用来读取数据库的内容。如果要更新数据库,那么应该发送一个POST请求。

    浏览器发生一个POST请求之后,如果刷新,那么浏览器会提醒你表单可能重复提交了。所以一般而言,发生一个POST请求之后需要让浏览器转向,可以转向到同一个页面,也可以是其他页面。这样用户再点击刷新就不会重复提交数据了。

    在你的情况里,可以考虑点击B.aspx?ID=2之后,等完成了数据库更新,再转到C.aspx或者A.aspx页面,防止重新提交。

    http://en.wikipedia.org/wiki/Post/Redirect/Get

    • 已标记为答案 阿波 2012年5月16日 13:45
    2012年5月11日 10:00
    版主