阻止ASP.Net中的表单重新提交(不重定向到我自己)

use*_*632 6 forms asp.net http code-behind

我有一个带有Form元素(<form runat="server">)的母版页,一个带有Button元素(<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Sync" />)的内容页面,以及一个包含该Button1_Click函数的Code Behind页面.

用户进入页面并单击按钮.Code Behind代码执行(在服务器上),它在其中更新数据库中的某些表.Code Behind代码所做的最后一件事是InnerHTML在内容页面上设置Span元素,并显示成功或失败消息.

一切都很好.问题是如果用户刷新页面,则重新提交表单,浏览器会询问是否真的是用户想要的.如果用户回答是肯定的,则重新执行Code Behind代码并再次更新数据库.如果用户反应消极,则没有任何反应.

重新执行代码背后的代码并不是什么大问题.它不会伤害任何东西.但这并不是我想要的行为.

我知道我可以使用Response.Redirect()重定向回页面,但用户永远不会看到我的成功或失败消息.我应该提一下,消息实际上不仅仅是"成功"或"失败",否则我想我可以在Redirect上的QueryString中添加一些内容.

有没有办法从Code Behind代码重置Form元素,以便如果用户刷新页面,表单不会重新提交?

主页......

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="IntuitSync.SiteMaster" %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:ipp="">
    <head runat="server">
    </head>
    <body>
        <form runat="server">
            <div runat="server" id="mainContetntDiv">
                <asp:ContentPlaceHolder ID="MainContent" runat="server" />
            </div>
        </form>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

内容...

<%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="~/Site.master" CodeBehind="SyncToCloud.aspx.cs" Inherits="IntuitSync.SyncToCloud" %>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Sync" />
    <span runat="server" id="SyncStatus"></span>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)

守则背后......

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Web;

namespace IntuitSync
{
    public partial class SyncToCloud : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            /*
                Do a bunch of stuff and put the results in syncResults which is a List.
            */
            SyncStatus.InnerHtml = string.Join("", syncResults.ToArray()); // I'd rather do this...
            //Response.Redirect(Request.Url.PathAndQuery, true);  // ...and not do this.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢任何和所有的帮助.

Ted*_*Ted 7

问题是你正在做一个表单POST,如果用户随后刷新页面,它会做它应该做的事情:重新提交POST.没有其他办法了.因此,您可以选择的选项如下:

  1. 重定向到确认页面,以某种方式将操作结果传递给确认页面(通常从某些数据存储库重新加载,如果它对查询字符串/ cookie /等不可行).
  2. 重定向到同一页面,但通过查询字符串参数传递成功消息(或者愚蠢地将其存储在会话/ ViewState/what-have-you-youilliness中).
  3. 一个表单得到了一个表单,而不是发布,因为它似乎没有发布任何值,只启动某种服务器端处理.为此,只需将表单从帖子更改为get,或者只是进行链接.这里的危险是你不应该在任何获取操作中进行任何变形/破坏性操作.

对于最后一个选项,你可能会感到最开心,但这完全取决于"做一堆东西并将结果放在syncResults中......"真的需要.