我想我终于找到了解决方案。虽然它不像我希望的那样优雅,但它确实有效(这比我迄今为止发现的要多)。解决方案在于 OnBegin AjaxOption 和一些 Jquery。我的 ActionLink(它也可能是应用到的 Ajax.BeginForm)看起来像这样
<%= Ajax.ActionLink("Do Ajax Function", "AjaxAction", new { }, new AjaxOptions { OnBegin="check_session", OnSuccess = "ajaxSuccess", UpdateTargetId = "update_container"}, new { })%>
我的帐户控制器中有一个控制器操作来检查会话,在我的情况下,我正在存储用户对象,所以我检查它是否为空,并返回“真”或“假”作为内容。 OutputCache 很重要,否则您的结果将被缓存。
[OutputCache(Duration=0, VaryByParam="None")]
public ActionResult CheckAjaxSessionExpired()
{
bool _sessionExpired = false;
if (Session["User"] == null)
{
_sessionExpired = true;
}
return Content(_sessionExpired.ToString());
}
最后一部分是指定为 OnBegin 处理程序的 check_session 函数。 Jquery ajax 调用命中会话检查操作并检查响应。如果响应为“真”(意味着会话已过期),则将页面的位置设置回主页(在这种情况下为 google)。
function check_session(){
var url = '<%= Url.Action("CheckAjaxSessionExpired", "Account") %>';
//GET CHECK SESSION
$.ajax({
url: url,
success: function(data) {
//alert(data);
if (data == "True"){
document.location = "http://www.google.com";
}
},
error: function() { alert("there was a problem loading the ajax session check"); }
});
}
如果使用这种方法,有几件事情要记住。首先是这将异步运行。如果您有正在调用的数据敏感代码,您仍然需要对会话执行服务器端检查。如果会话在 ajax 调用期间过期,此代码旨在简单地重定向到登录页面(或主页)。第二件事是 check_session 函数需要连接到所有 Ajax 调用的 OnBegin 事件中。如果有人对改进此方法有任何提示或建议,我很想听听。我希望这对某人有所帮助。