1

みなさん、おはようございます。

アップグレードとリファクタリングが必要なレガシーASPクラシックアプリケーションに取り組んでいます。行う必要のある最大の改善点の1つは、データベースから結果をキャッシュすることでアプリを高速化することでした。これは、それらを.datファイルにキャッシュすることで正常に実行できました。このアプリケーションは特定のパスをたどるので、使用を終えた後、未使用のキャッシュファイルを削除しています。ただし、アプリケーションの最後の.aspページ(PV.asp)では、ファイルは削除されるべきではないときに削除されます。

私の意図はこれです、

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

^これは「完了」ボタンのコードで、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

1 に答える 1

5

それはASPがどのように機能するかではありません。ASPコードセグメント(の間のもの<% ... %>)は、ページが最初にロードされたときに1回だけ計算されます。

たとえば、これを行う場合:

<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を使用してすべての動的コードセグメントを処理し、次にユーザーが読み込むことができるページをユーザーに返します。<% %>注:ブラウザはタグの処理方法を認識していません。それができるのはサーバーだけです。

これは意味がありますか?

ここで実際にやろうとしていることを実行するためのいくつかのオプションがありますが、必要なfso.DeleteFileコマンドを呼び出すだけで、新しいASPページに対してAjaxリクエストを実行します。

次に例を示します:http ://www.degraeve.com/reference/simple-ajax-example.php

他のオプションは、DeleteFileをトリガーするパラメーターを使用して同じページへのget/postを使用することです。それを使用するには、少し再設計する必要があります。ajaxソリューションをお勧めします。

于 2012-09-24T15:33:20.433 に答える