利用服务器控件做的页面,刷新按钮一按,客户端会把View中的数据重新送到服务器端,从而造成数据插入两次的问题。
解决方案利用服务器端的session和客户端的ViewState中保存的数据是否不同来判定。
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ Page Language="VB" Strict="True" %>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ Import Namespace="System.Data" %>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ Import Namespace="System.Data.SqlClient" %>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<script runat="server">![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
Sub Page_Load (sender As Object, e As EventArgs)
If Not Page.IsPostBack then
Session("AddTime") = Server.URLEncode(System.DateTime.Now.ToString())
End If
End Sub
![](/Images/OutliningIndicators/InBlock.gif)
Sub Page_PreRender (sender As Object, e As EventArgs)
ViewState("AddTime") = Session("AddTime")
End Sub
![](/Images/OutliningIndicators/InBlock.gif)
Sub Button1_Click(sender As Object, e As EventArgs)
If Session("AddTime").ToString() = ViewState("AddTime").ToString() Then
If AddEmployee(firstName.Text, lastName.Text) = 0
Message.Text = "Success"
Session("AddTime") = Server.URLEncode(System.DateTime.Now.ToString())
Else
Message.Text = "Failure - - Database"
End If
Else
Message.Text = "Failure - Session"
End If
End Sub
![](/Images/OutliningIndicators/InBlock.gif)
Function AddEmployee(firstName As String, lastName As String) As Integer
Dim connectionString As String = "server='(local)'; trusted_connection=true; database='Northwind'"
Dim dbConnection As New SqlConnection(connectionString)
Dim insertString As String = "INSERT INTO Employees (FirstName, LastName) VALUES (@FirstName, @LastName)"
Dim dbCommand As New SqlCommand
dbCommand.CommandText = insertString
dbCommand.Connection = dbConnection
dbCommand.Parameters.Add(New SqlParameter("@FirstName",SqlDbType.NVarchar,10))
dbCommand.Parameters("@FirstName").Value = firstName
dbCommand.Parameters.Add(New SqlParameter("@LastName",SqlDbType.NVarchar,20))
dbCommand.Parameters("@LastName").Value = lastName
Dim rowsAffected As Integer = 0
Dim commandResult As Integer = 1
Try
dbConnection.Open
rowsAffected = dbCommand.ExecuteNonQuery
If rowsAffected > 0 Then commandResult = 0
Catch ex AS SqlException
commandResult = ex.Number
Finally
dbConnection.Close
End Try
Return commandResult
End Function
</script>
<html>
<head>
<title>Preventing Duplicate Record Insertion on Page Refresh - Using a Session and ViewState Variables</title>
</head>
<body>
<form runat="server">
<p>First Name <asp:TextBox id="firstName" runat="server" />
<p>Last Name <asp:TextBox id="lastName" runat="server" />
<p><asp:Button id="Button1" onclick="Button1_Click" runat="server" Text="Add Employee" />
<p><asp:Label id="Message" runat="server" />
<input id="hiddenSession" type="hidden" runat="server" />
</form>
</body>
</html>
![](/Images/OutliningIndicators/None.gif)