【问题标题】:Refresh after postback causes the same data to be sent again回发后刷新导致再次发送相同的数据
【发布时间】:2012-04-01 17:38:02
【问题描述】:

我有一个表格来编辑员工信息。如果用户希望为所选员工输入新的电子邮件地址,则会出现一个文本框和一个显示“添加电子邮件地址”的按钮。很简单,你输入邮箱地址,点击Add Email Address。它回发并且该按钮的事件处理程序执行对数据库的 INSERT。


问题: 如果在回发后按 F5 刷新页面,即使文本框为空白,也会导致发生相同的回发。换句话说,每次您按下 F5 时,事件处理程序中的添加电子邮件地址按钮的操作都会再次发生。如果我按 F5 十次,相同的电子邮件地址会在数据库中显示十次。


我发现的一个建议是“在应用更改后重新定向到同一页面”。这在我们的例子中并不理想的原因是它是一种相当冗长的员工数据形式 --- 如果用户对整个表单进行大量更改(例如 FirstName、LastName 等),然后进行 e-在将更改应用到其他地方之前添加邮件,如果我们重定向到同一页面,其他地方的更改将会丢失。

我能想到的非常冗长的解决方案是,捕获 ViewState 中的所有数据,将其携带到重定向到同一页面,然后在 URL 中使用查询字符串来确定是否要填写来自 ViewState 的数据。在我踏上这条路之前,我希望有一些我只是不知道的方法,而不是像 PostbackButDontRetainPostbackData() (一厢情愿,我知道)。

【问题讨论】:

    标签: c# asp.net refresh postback page-refresh


    【解决方案1】:

    在该添加电子邮件地址按钮的处理程序中,检查电子邮件是否已存在于数据库中。如果是这样,请不要再次添加电子邮件并向用户显示适当的消息。通常表单有一个保留区域,例如隐藏的 div,因此如果出现任何问题,该 div 将填充错误消息并显示给用户。

    此外,当用户的数据被成功接收和处理时,它会帮助向用户显示确认消息。

    更新

    如果您不喜欢向用户显示任何消息,只需在发现该电子邮件已存在于数据库中后什么都不做。例如:

    public void AddEmailToDB(string email)
    {
        // first find out if the email already exists in the database
        bool isDuplicate = ...; 
        // if it does, simply return and do nothing
        if(isDuplicate) return; 
    
        // if control reaches here then the email is not
        // a duplicate and you can do your normal processing
    }
    

    更新 II

    如果您不希望每次用户在回发后按 F5 时浏览器都显示一个消息框,您可以使用 AJAX 进行部分回发,方法是包装您的电子邮件文本框并在 UpdatePanel 中添加按钮,这很容易使用。

    【讨论】:

    • 我明白你在说什么,我们确实会检查电子邮件地址是否存在。这仍然会导致每次刷新时出现一个不相关的消息框。我想要的是页面刷新以刷新页面而不使用以前的回发数据。
    • @CptSupermrkt,你指的是浏览器显示的消息框吗?
    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    相关资源
    最近更新 更多