c# - 文件下載後如何修復凍結頁面?(TreeView中的TransmitFile SelectedNodeChanged)




asp.net sharepoint (2)

我不確定我是否真的了解你的情況,但是你的應用程序很可能被凍結,因為UI線程掛在你試圖同步運行的代碼上。

為了防止這種情況發生,您需要異步運行邏輯。

public async void OnSelectedNodeChanged(object sender, EventArgs e)
{
    await Task.Run(() => {
        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
        response.ClearContent();
        response.Clear();
        response.ContentType = "text/txt";
        response.AddHeader("Content-Disposition", "attachment; filename=" + TreeView1.SelectedNode.Text + ";");
        response.TransmitFile(TreeView1.SelectedNode.Value);
        response.Flush();
        response.Close();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }).ConfigureAwait(false);
}

這是一個異步無效的方法,這意味著引發這個事件的代碼不會等待它完成,也不會知道它何時完成。

這將阻止線程鎖定您的用戶界面,但是如果用戶有能力通過單擊您的用戶界面來“快速觸發”這些事件,則可能不希望以這種方式編寫代碼。

無論如何,你可能需要某種形式的異步邏輯來完成你想要的東西。

所以我知道這是常見的問題,頁面凍結(任何按鈕在視覺上是可點擊的,但不執行任何操作),因為它沒有關閉文件下載後的一些請求。

System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "text/txt";
response.AddHeader("Content-Disposition", "attachment; filename=" + TreeView1.SelectedNode.Text + ";");
response.TransmitFile(TreeView1.SelectedNode.Value);
response.Flush();
response.Close();
HttpContext.Current.ApplicationInstance.CompleteRequest();

此代碼在TreeView SelectedNodeChanged事件中,這是一個問題。

例如,如果將該傳輸代碼放在某個按鈕中,我可以通過向按鈕添加OnClientClick="javascript:setFormSubmitToFalse()"來修復頁面的凍結,並且這個小的JavaScript在下載後修復頁面凍結。

<script type="text/javascript">
    //Fix page freeze after download dialog
    function setFormSubmitToFalse() {
        setTimeout(function () { _spFormOnSubmitCalled = false; }, 3000);
        return true;
    }
</script>

但是我不知道如何解決這個問題,如果我點擊TreeView節點。 TreeView沒有OnClientClick ,我也嘗試從代碼後面傳遞代碼的前後運行JS函數Page.ClientScript.RegisterStartupScript(this.GetType(), "CallMyFunction", "setFormSubmitToFalse()", true); 但這並沒有幫助,文件下載後頁面仍然凍結。

任何想法如何解決這個問題? 謝謝。

這是在SharePoint站點上的webpart(幾乎是asp.net頁面)。

編輯:

我會盡力解釋我的情況,以及我想要達到的目標。

所以我的主要目標是:在本地網絡中有一個共享文件夾,使用這個應用程序的用戶不應該有權訪問這個共享文件夾,只有運行App池的實體才能訪問它。

我正在做一些SQL請求,給我一些子文件夾的路徑。 我正在構建該子文件夾的樹視圖,當用戶點擊樹視圖SelectedNodeChanged事件鏡頭中的一些文件,我執行傳輸文件作為應用程序池標識

SPSecurity.RunWithElevatedPrivileges(delegate()
   {
   /* transmit file code */
   }); 

一切工作正常,但如果我理解正確的話,CLIENT端的東西可能會凍結頁面TransmitFile射擊後,並阻止向服務器發送任何其他職位的請求,這就是為什麼我的小JS解決方案,當它被執行OnClientClick。

這是原來如何作者的修復解釋說,但我不知道如何實現這個到treeview https://stackoverflow.com/a/17186011/5805492


所以解決方案很簡單,但有點棘手。

節點沒有onClientClick事件,但我們可以添加JS點擊事件到任何頁面元素,對不對? 所以這裡是訣竅,創建TreeView只需添加點擊實際文本的節點的幫助下:

...
TreeNode fileNode = new TreeNode
 {
     //before
     //Text = file.Name,
     //after
     Text = "<span onclick=\"javascript:setFormSubmitToFalse();\">"+file.Name+"</span>",
     Value = file.FullName,
 };
...

並且在傳輸節點的文件解析文本中具有正常的文件名稱:

response.AddHeader("Content-Disposition", "attachment; filename=" + 
    TreeView1.SelectedNode.Text.Replace("<span onclick=\"javascript:setFormSubmitToFalse();\">", string.Empty).Replace("</span>", string.Empty) + ";");

現在一切正常,下載後頁面不再凍結。





web-parts