我有一个关于使用会话的问题,或者在一页上工作时TempData可能存储数据。我使用多个Ajax请求存储和检索数据,并保存到我的控制器Action上的会话。我想做的是,当用户离开我的页面时,我想清除会话变量。我怎么会用会话呢?或者也许存在某种其他方式来存储仅一个http请求的数据(我不确定这是因为我说我在页面中有多个POST以及GET请求。)
任何帮助将不胜感激。感谢
答案 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事件并删除所有会话变量。