meluckeve

导航

ASP.NET中F5刷新按键数据插入两次的问题

 

利用服务器控件做的页面,刷新按钮一按,客户端会把View中的数据重新送到服务器端,从而造成数据插入两次的问题。

解决方案利用服务器端的session和客户端的ViewState中保存的数据是否不同来判定。

<%@ Page Language="VB" Strict="True" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">

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

Sub Page_PreRender (sender As Object, e As EventArgs)
    ViewState(
"AddTime"= Session("AddTime")
End Sub

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

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>

posted on 2005-07-14 18:58  lucksleep  阅读(706)  评论(0编辑  收藏  举报