我有一个关于在处理一页时使用会话或 TempData 来存储数据的问题。我使用多个 Ajax 请求存储和检索数据,并在我的控制器 Action 上保存到会话。我想做的是,当用户离开我的页面时,我想清除会话变量。我将如何使用会话来做到这一点?或者也许有某种其他方法可以仅为一个 http 请求存储数据(我不确定这一点,因为正如我所说,我在页面中有多个 POST 和 GET 请求。)
任何帮助,将不胜感激。谢谢
我有一个关于在处理一页时使用会话或 TempData 来存储数据的问题。我使用多个 Ajax 请求存储和检索数据,并在我的控制器 Action 上保存到会话。我想做的是,当用户离开我的页面时,我想清除会话变量。我将如何使用会话来做到这一点?或者也许有某种其他方法可以仅为一个 http 请求存储数据(我不确定这一点,因为正如我所说,我在页面中有多个 POST 和 GET 请求。)
任何帮助,将不胜感激。谢谢
你没有Hiddenfields
在你的 html 中使用来保存这些数据......
与 Asp.Net 相同,使用隐藏字段来存储视图状态数据.....
使用 Html.HiddenFor(myModel => myModel.SomeField) 来做到这一点。您可以为其分配值,然后它会自动将值回传到您的模型中,这非常方便花花公子。
我希望这是有帮助的!
如果您真的想使用 TempData(我有时会这样做),我有一个看起来像这样的 KeepTempDataAlive(string tempKey) 方法......
if(TempData[tempKey] != null)
{
TempData.Keep(tempKey);
}
这应该让它再发 1 个回帖。只要你需要,就这样做。
取决于你的意图。
如果您想对 Ajax 请求进行异步处理,您可以将数据存储在隐藏字段或 .success 事件上的 jQuery .data() 中。然后当一切都完成后,使用 jQuery 来填充你需要做的事情。
如果您想要一个真正的会话变量(跨多个页面),那么最好的方法是在 window.close 上使用 AJAX 进程来清除会话。尽管这仅限于启用了 javascript 的用户。我认为没有万无一失的方法可以做到这一点。
我利用 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 事件并删除所有会话变量。