2011-06-06 51 views
1

運行兩次我創建了一個VB.NET頁面來記錄廣告的視圖,並將從img src調用頁面。ASP.NET Page_Load由於Bitmap.Save

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 

    Dim insert_number As Integer = 0 
    Dim ad_id As Integer = 0 

    If Request.QueryString("adid") Is Nothing Then 
     ad_id = 0 
    Else 
     If Not Integer.TryParse(Request.QueryString("adid"), ad_id) Then 
      ad_id = 0 
     End If 
    End If 

    Dim connectStr As String = System.Configuration.ConfigurationManager.AppSettings("connectStr").ToString() 
    Dim myconnection As SqlConnection = New SqlConnection(connectStr) 
    Dim mySqlCommand As SqlCommand 
    myconnection.Open() 

    Try 
     mySqlCommand = New SqlCommand("sp_record", myconnection) 
     mySqlCommand.CommandType = CommandType.StoredProcedure 
     mySqlCommand.Parameters.AddWithValue("@record_id", ad_id) 
     insert_number = mySqlCommand.ExecuteNonQuery() 
    Catch ex As Exception 

    End Try 
    myconnection.Close() 

    Dim oBitmap As Bitmap = New Bitmap(1, 1) 
    Dim oGraphic As Graphics = Graphics.FromImage(oBitmap)  
    oGraphic.DrawLine(New Pen(Color.Red), 0, 0, 1, 1) 

    'Response.Clear() 
    Response.ContentType = "image/gif" 

    oBitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif) 

    'oBitmap.Dispose() 
    'oGraphic.Dispose() 

End Sub 

除非我的評論oBitmap.Save線,代碼運行兩次,它使兩個刀片(店prcoedure運行兩次)數據庫。

我在@PAGE試過AutoEventWireup =「true」和「false」。 「true」運行兩次代碼,「false」沒有做任何事情(沒有錯誤),也沒有給出任何輸出。

我也曾嘗試下列尋釁1像素圖像輸出的版本,但它並運行兩次,以及(它需要aspcompat =在@PAGE部分屬實):

'Response.ContentType = "image/gif" 
    'Dim objStream As Object 
    'objStream = Server.CreateObject("ADODB.Stream") 
    'objStream.open() 
    'objStream.type = 1 
    'objStream.loadfromfile("c:\1pixel.gif") 
    'Response.BinaryWrite(objStream.read) 

任何想法都歡迎。

回答

1

您可能想爲圖像執行onload函數,以查看爲什麼第二次調用該函數。我猜測它是在預加載的某個地方加載的,然後在加載頁面期間被調用(.Save),這就是爲什麼你會看到重複條目。

如果您想獲得獨特的網頁加載後,你可能會想嘗試把oBitmap.Save線檢查中的回發這樣的頁面加載內:

If Page.IsPostback = False Then 
    'Bitmap Code Here 
End If 

,看看是否修復它爲你。

如果您從數據庫加載數據,您需要確保它也位於該回發檢查中(因爲您正在加載數據兩次,並且它可能會導致這些雙重回傳一些情況)。

編輯:想編輯代碼段以包含所有的位圖代碼,而不僅僅是保存。

+0

我已經添加Page.ISPostback部分。如果我從標記調用它,所有代碼都可以正常工作,但是如果我直接從URL調用頁面,它將工作兩次,即使所有內容都位於Page.IsPostback檢查 – 2011-06-07 07:24:33

+0

好吧,聽起來像是發生了什麼,因爲代碼在加載時,它正在加載,然後在圖像本身加載後再次初始化。你可以做一些檢查,看看代碼是被頁面還是img調用,然後在頁面調用時不執行代碼?或者,也許另一種選擇是將這些代碼放入img的加載函數(更改爲asp:image控件),並查看是否僅調用一次。 今天我會討論它,看看我是否可以複製/解決這個問題。 – akuta 2011-06-07 15:14:33

+0

澄清有問題的代碼似乎在頁面加載時運行,然後在圖像代碼返回數據時再次運行。我今天早上看看它,看看我想出了什麼。 – akuta 2011-06-07 15:24:48

1

不確定具體情況,但這是Page_Load函數中的很多代碼。

一般來說,我會解決這類問題的方法是有某種頁面參數,您可以檢查以執行正確的操作。您可以將一些獲取/發佈參數添加到您可以檢查或查看諸如Page.IsPostBack之類的呼叫。

0

我意識到這是一箇舊的帖子,但我有一個類似的問題,其中頁面在回發兩次發射。我發現有幾篇文章解釋了這裏正在討論的問題。但是,更正我的問題是在頁面級別設置頁面僞指令屬性AutoEventWireup = false。

這是一篇很好的文章How to use the AutoEventWireup attribute in an ASP.NET Web Form by using Visual C# .NET,幫助我解決了這個問題。

希望這會有所幫助!

Risho