在会话中保存数据,直到用户离开页面

时间:2012-05-24 16:51:13

标签: asp.net asp.net-mvc-3

我有一个关于使用会话的问题,或者在一页上工作时TempData可能存储数据。我使用多个Ajax请求存储和检索数据,并保存到我的控制器Action上的会话。我想做的是,当用户离开我的页面时,我想清除会话变量。我怎么会用会话呢?或者也许存在某种其他方式来存储仅一个http请求的数据(我不确定这是因为我说我在页面中有多个POST以及GET请求。)

任何帮助将不胜感激。感谢

4 个答案:

答案 0 :(得分:1)

你没有在html中使用Hiddenfields来保存这些数据......

与使用hiddenfield存储视图状态数据的Asp.Net相同.....

答案 1 :(得分:1)

使用Html.HiddenFor(myModel => myModel.SomeField)来执行此操作。您可以为其分配值,然后它会自动将值回发到您的模型中,这是非常方便的花花公子。

我希望这有用!

如果你真的想使用TempData(我偶尔会这样做),我有一个看起来像这样的KeepTempDataAlive(字符串tempKey)方法......

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

那应该保留一个以上的帖子。只要你需要,就这样做。

答案 2 :(得分:0)

取决于你的意图。

如果您想对Ajax请求执行异步操作,可以将数据存储在隐藏字段或.success事件中的jQuery .data()中。然后当一切都完成后,使用jQuery填充你需要做的事情。

如果你想要一个真正的会话变量(跨多个页面),那么最好的方法就是在window.close上进行AJAX过程以清除会话。虽然这仅限于启用了javascript的用户。我不认为这是一种万无一失的方法。

答案 3 :(得分:0)

我利用jQuery和在页面卸载时运行的ajax请求解决了这个问题。

在你的javascript中:

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

注意:您需要设置async:false,否则页面将在有机会运行ajax请求之前卸载。对于该类型,您可以使用GET或POST,无论您的偏好是什么以及您想要对请求做什么。

然后在你的api控制器中:

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

你也可以添加代码来检查返回,如果你想看看它是否成功,但在我的情况下我只是想要一个快速的东西运行,并不是真的希望它返回任何东西,它不是'如果它失败了很重要,所以我只是发送请求并卸载。我知道这个问题已经过时了,但希望它可以帮助其他人。

注意:此解决方案的问题是,如果用户刷新页面,它仍将调用unload事件并删除所有会话变量。