2012-03-16 82 views
0

我有一个表单来编辑员工信息。如果用户希望为选定的员工输入新的电子邮件地址,则会显示一个文本框和一个表示“添加电子邮件地址”的按钮。非常简单,您输入电子邮件地址,单击添加电子邮件地址。它回发并且该按钮的事件处理程序对数据库执行INSERT。回发后刷新导致再次发送相同的数据


问题: 如果按F5即回发后刷新页面,它会导致发生,即使文本框为空同回发。换句话说,每次你点击F5时,该添加电子邮件地址按钮的事件处理程序中的操作都会再次出现。如果我点击F5十次,那么同一个电子邮件地址会在数据库中显示十次。


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

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

回答

0

在该添加电子邮件地址按钮的处理程序中,检查电子邮件是否已存在于数据库中。如果是,请不要再次添加电子邮件并向用户显示适当的消息。通常窗体有一个像这样的隐藏div的保留区域,以防万一发生错误,div会填充错误消息并显示给用户。

此外,它将有助于在用户成功接收并处理其数据时向用户显示确认消息。

UPDATE

如果你不喜欢展现给用户的任何消息,干脆什么也不做你发现后,该电子邮件地址已存在于数据库中。例如:

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 
} 

UPDATE II

如果你不希望浏览器显示一个消息框,每次用户回传后按F5,你可以通过包装你的电子邮件做使用AJAX部分回发文本框并在UpdatePanel中添加按钮,它非常易于使用。

+0

我明白你的意思了,实际上我们会检查电子邮件地址是否存在。这仍然会导致每次刷新的消息框不相关。我想要的是页面刷新刷新页面没有以前的回发数据。 – CptSupermrkt 2012-03-16 06:30:22

+0

@CptSupermrkt,你是指浏览器显示的消息框? – 2012-03-16 06:38:02

+0

@CptSupermrkt,请参阅最新的答案。 – 2012-03-16 06:41:37