2012-09-24 64 views
1

大家早上好,ASP經典刪除緩存文件後,用戶點擊「完成」按鈕

我上需要一些升級和重構的傳統ASP經典應用程序的工作。需要做出的最大改進之一是通過緩存數據庫結果來加速應用程序。這我已經能夠成功地將它們緩存到.dat文件。這個應用程序遵循特定的路徑,所以我在完成它們之後一直刪除未使用的緩存文件。但是,在應用程序(PV.asp)的最後一個.asp頁面上,文件在不應該被刪除時會被刪除。

我的目的是這個,

<input type="button" value="Done" style="width: 56px; height: 40px" onclick="finish()" /> 

^這是爲「完成」按鈕的代碼,它調用完成()函數。以下哪個是:

function finish() { 
     var size = "<%response.write(size) %>"; 
     if (size == "0") { 
     var done = confirm("All Items mod, would you like to save?"); 
     if (done == true) 
     { 
      if (window.XMLHttpRequest) 
      { 
       xmlhttp = new XMLHttpRequest(); 
      } 
      else 
      { 
       xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
      } 
      var concode = "<%=Replace(concode, "\", "\\")%>"; 
      xmlhttp.onreadystatechange=function() 
      { 
       if (xmlhttp.readyState==4 && xmlhttp.status==200) 
        { 
         document.getElementById('concode').value = concode; 
         document.forms["confirm"].submit(); 
        } 
      } 
      <%if NOT rsTrxTy.EOF then 
      if rsTrxTy.fields("TYPE").value = "TO" then%> 
      ~Stuff happens here~ 
      <%end if 

      if rsTrxTy.fields("TYPE").value = "TI" then%> 
      ~Stuff happens here~ 
      <%end if 
      end if 

      if NOT rsOrdrs.EOF then%> 
      ~Stuff happens here~ 
      <%end if %> 
      <% 
      dim fso 
      Set fso = Server.CreateObject("Scripting.FileSystemObject") 
      fso.DeleteFile "C:\M\cache\rstrxis-" & Session.SessionID & ".dat" 
      fso.DeleteFile "C:\M\cache\rstrxos-" & Session.SessionID & ".dat" 
      fso.DeleteFile "C:\M\cache\rstrxty-" & Session.SessionID & ".dat" 
      fso.DeleteFile "C:\M\cache\rsords-" & Session.SessionID & ".dat" %> 
     } 
    } 
    else { 
      alert("All items have not been mod."); 
     } 
    } 

當用戶點擊「完成」按鈕,對項目做出的更改是提交到數據庫。我的意圖是,當執行此操作時,緩存的文件將被刪除。 但是,即使用戶沒有單擊「完成」按鈕,也會運行DeleteFile命令。它在頁面加載完成後運行。這會導致問題,因爲頁面將嘗試從加載PV.asp時刪除的緩存文件加載。由於此應用程序旨在幾乎不斷地關閉窗口,因此會話ID將保持不變,從而不會刪除緩存文件(因爲應用程序重新啓動時它將嘗試加載已經存在的內容被緩存)。

我的問題是,爲什麼這些文件被當他們應該被包含在一個JavaScript函數,只有當用戶點擊完成執行刪除?我沒有經驗的ASP/Javascript,因爲這個項目被強迫我,所以我很抱歉,如果這是一個簡單的問題,但我誠實難住。

注意 - 移動到ASP.Net是出了問題。請不要提出這個建議。

回答

4

這不是ASP是如何工作的。 ASP代碼段(<% ... %>之間的內容)僅在首次加載頁面時計算一次。

例如,如果你這樣做:

<script type="text/javascript"> 
function finish() { 
<%    
dim fso 
Set fso = Server.CreateObject("Scripting.FileSystemObject")     
fso.DeleteFile "C:\M\cache\rstrxis-" & Session.SessionID & ".dat"    
fso.DeleteFile "C:\M\cache\rstrxos-" & Session.SessionID & ".dat"    
fso.DeleteFile "C:\M\cache\rstrxty-" & Session.SessionID & ".dat"    
fso.DeleteFile "C:\M\cache\rsords-" & Session.SessionID & ".dat" 
%> 
} 
</script> 

fso.DeleteFile函數調用被稱爲頁面加載時,而不是在JavaScript函數被觸發。

爲什麼?當服務器接收到ASP頁面的請求時......它首先處理並處理<% %>與真實HTML之間的所有動態代碼段,然後向用戶返回它們可以加載的頁面。注意:瀏覽器不知道如何處理<% %>標籤!服務器是唯一可以做到這一點的人。

這是否有意義?

你有幾個選擇去實際嘗試在這裏做什麼,但我會執行一個Ajax請求到一個新的ASP頁面,它所要做的就是調用你需要的fso.DeleteFile命令。

下面是一個例子:http://www.degraeve.com/reference/simple-ajax-example.php

其他選項是使用一個GET/POST到同一個頁面,將觸發的DeleteFile的參數。你必須重新設計一下才能使用它。我推薦ajax解決方案。

+0

這很有道理。我感覺這是ASP的一個屬性,但我找不到任何明確的信息。那麼,我將如何完成我的原創設計?我唯一的想法是將用戶發送到執行「清理」操作的新的.asp頁面,例如刪除緩存。你怎麼看? – ScruffMcGruff

+1

增加了一些更多信息。基本上,使用ajax請求到一個新的ASP頁面,其中頁面實際上沒有內容,但是執行了你需要的DeleteFile命令。 –

+0

很好的回答,相當於<% and %>標籤的陷阱。 – TelJanini