2012-05-24 47 views
1

我有一個關於使用會話,或者可能TempData存儲數據,同時在一個頁面上工作的問題。我使用多個Ajax請求存儲和檢索數據,並保存到我的控制器Action上的會話。我想要做的是,當用戶離開我的頁面時,我想清除會話變量。我將如何與會議做到這一點?或者也許有某種其他方式來存儲數據只有一個http請求(我不知道這一點,因爲我說我有多個POST以及頁面內的GET請求。)保持會話中的數據,直到用戶離開頁面

任何幫助將讚賞。由於

回答

1

你不要你使用Hiddenfields在你的HTML來保存數據...

同Asp.Net使用hiddenfield存儲視圖狀態數據.....

0

取決於你的意圖。

如果您想要使用Ajax請求執行異步事件,您可以將數據存儲在隱藏字段或您的.success事件中的jQuery .data()中。然後,當一切都完成後,使用jQuery來填充你需要完成的工作。

如果您想要一個真正的會話變量(跨多個頁面),那麼最好的方法是在window.close上清除會話。儘管這僅限於啓用了JavaScript的用戶。我不認爲有這樣一個萬無一失的方法。

1

使用Html.HiddenFor(myModel => myModel.SomeField)來執行此操作。您可以將值分配給它,然後它會自動將值返回到您的模型中,這是超方便的。

我希望這有幫助!

如果你真的想使用TempData的(我有時做),我有一個看起來像這樣一個KeepTempDataAlive(字符串tempKey)方法...

if(TempData[tempKey] != null) 
{ 
    TempData.Keep(tempKey); 
} 

這應該保持它周圍1更多回帖。只要你需要,就做這個。

0

我解決了這個問題,利用jQuery和頁面卸載時運行的ajax請求。

在你的JavaScript:

$(window).unload(function() { 
    $.ajax({ 
    url: applicationPath + "/api/ExampleApiController/ExampleWebMethod", 
    async: false, 
    type: 'GET', 
    data: { 
     "someVariable": anythingYouWantToPassIfAny, 
     "otherVariable": anythingElseYouWantToPass, 
    } 
    }); 
}); 

注意:您需要設置異步:假,否則頁面將卸載它有機會運行Ajax請求之前。對於該類型,您可以使用GET或POST,無論您的偏好是什麼以及您希望對請求做什麼。

public class ExampleApiController 
{ 
    [HttpGet] 
    public void ExampleWebMethod(string someVariable, string otherVariable) 
    { 
    HttpContext.Current.Session.Remove("sessionVariableA"); 
    HttpContext.Current.Session.Remove("sessionVariableB"); 
    ... 
    } 
} 

您還可以添加代碼來檢查返回,如果你想看看它是否是成功還是失敗,但對我來說我只是想盡快的東西來運行:

在您的API控制器

然後並不是真的想要它返回任何東西,如果它失敗了,這不是什麼大問題,所以我只是發送請求並卸載。我知道這個問題很老,但希望它能幫助別人。

注意:此解決方案的問題是,如果用戶刷新頁面,它仍將調用卸載事件並刪除所有會話變量。

相關問題